我有 2 个 Bash 脚本。第一个脚本以 2 个字符串作为参数,创建一个环境变量,其名称为第一个字符串,并将其值设置为使用 openssl (v3.4.2) 加密的第二个字符串的值。第二个脚本以 1 个字符串作为参数,并输出环境变量的解密值,该变量的名称是作为参数传递的字符串的值。
设置脚本
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: $0 <variable_name> <string_to_encrypt>"
exit 1
fi
VAR_NAME=$1
STRING_TO_ENCRYPT=$2
# Generate a random salt and passphrase
SALT=$(openssl rand -hex 8)
PASSPHRASE=$(openssl rand -hex 12)
# Encrypt the string
ENCRYPTED=$(echo -n "$STRING_TO_ENCRYPT" | openssl enc -aes-256-cbc -a -salt -pbkdf2 -pass pass:"$PASSPHRASE" -S "$SALT")
# Combine salt, passphrase, and encrypted string
RESULT="${SALT}:${PASSPHRASE}:${ENCRYPTED}"
# Set the environment variable
export "$VAR_NAME=$RESULT"
echo "Environment variable $VAR_NAME has been set with the encrypted value."
示例用法
source ./setit.sh MY_VAR secret_value
获取它
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <variable_name>"
exit 1
fi
VAR_NAME=$1
# Check if the environment variable exists
if [ -z "${!VAR_NAME}" ]; then
echo "Error: Environment variable $VAR_NAME does not exist."
exit 1
fi
# Get the value of the environment variable
ENCRYPTED_VALUE="${!VAR_NAME}\n"
echo "$VAR_NAME = $ENCRYPTED_VALUE"
# Extract salt, passphrase, and encrypted string
IFS=':' read -r SALT PASSPHRASE ENCRYPTED <<< "$ENCRYPTED_VALUE"
# Decrypt the string
DECRYPTED=$(echo -n "$ENCRYPTED" | openssl enc -aes-256-cbc -d -a -pbkdf2 -pass pass:"$PASSPHRASE" -S "$SALT")
# Check if decryption was successful
if [ $? -eq 0 ]; then
echo "Decrypted value of $VAR_NAME:"
echo "$DECRYPTED"
else
echo "Error: Decryption failed. The encrypted value may be corrupted or tampered with."
exit 1
fi
示例用法
./getit.sh MY_VAR
第一个脚本似乎按预期工作,但是当我运行第二个脚本来解密该值时,出现以下错误:
解密失败 0031185FF87F0000:错误:1C80006B:Provider 例程:ossl_cipher_generic_block_final:最终块长度错误:providers/implementations/ciphers/ciphercommon.c:444: 错误:解密失败。加密值可能已损坏或被篡改。
该wrong final blocklength
部分告诉我这可能是填充问题,但我不完全确定。
需要进行两项更改
getit.sh
:\n
定义时删除尾随ENCRYPTED_VALUE
;在字符串末尾ENCRYPTED_VALUE="${!VAR_NAME}\n"
添加文字字符\
和,这会破坏加密数据n
echo
(无) ;我猜想在从管道读取输入时需要将换行符 ( ) 视为行终止符,并且足够智能地忽略所述换行符作为加密数据的一部分-n
$ENCRYPTED_VALUE
openssl
openssl
\n
openssl
新的代码行:
进行试驾: