为何OpenSSL解密命令在Linux正常,在macOS(OSX)无法运行?
问题:Linux下正常解密的OpenSSL命令在macOS仅输出用法信息
问题背景
一段AES-256-CBC解密命令在Linux(OpenSSL 3.0.11)环境可正常执行并输出解密文本,但在macOS(LibreSSL 2.6.5)环境下仅打印OpenSSL用法提示,无解密结果也无错误提示。
核心解密命令:
pwd=$(echo "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass "pass:$salt_password")
完整脚本如下:
#!/bin/bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # password_file="$SCRIPT_DIR/test_passfile_2.ssl" password_file="U2FsdGVkX18RH4KXM5Ldz0Q2ny8RQegoaDPObu50Y6k=" salt_password="salt password" # Decrypt password file or encrypted passwrod string if provided if [ -n "$password_file" ]; then if [ -f "$password_file" ]; then echo "Decrypting password file using salt password..." pwd=$(cat "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass "pass:$salt_password") else echo "Decrypting password string using salt password..." pwd=$(echo "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass "pass:$salt_password") fi esc() { printf "%s" "$1" | sed -e "s/'//g" } # utilize the function so that we don't need to quote pwd. password=$(esc "${pwd}") unset pwd if [ $? -ne 0 ]; then echo "Error: Failed to decrypt password." exit 1 fi echo "Password decrypted successfully." fi echo $password # Should output 'test'
macOS终端仅输出OpenSSL enc命令的用法说明,无解密结果。
原因分析
问题核心是LibreSSL 2.6.5不支持-pbkdf2和-iter参数:
pbkdf2是OpenSSL 1.0.0以后引入的密钥派生算法,旧版LibreSSL(如2.6.5)默认使用传统的EVP_BytesToKey算法,完全不识别-pbkdf2参数-iter是配合-pbkdf2使用的迭代次数设置,旧版LibreSSL同样不支持该参数
当命令中出现不被识别的参数时,LibreSSL会判定命令格式错误,直接输出用法提示,而非明确的错误信息。
解决方法
方案1:升级macOS的OpenSSL版本
macOS默认的LibreSSL版本偏低,可通过Homebrew安装官方OpenSSL:
brew install openssl
安装后,使用完整路径调用新版OpenSSL(或配置环境变量优先使用新版):
pwd=$(echo "$password_file" | /usr/local/bin/openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass "pass:$salt_password")
方案2:修改命令适配旧版LibreSSL
如果无法升级OpenSSL,需去掉不支持的-pbkdf2和-iter参数,同时确保加密时也使用相同的传统算法流程:
pwd=$(echo "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -salt -pass "pass:$salt_password")
注意:这种方式使用的EVP_BytesToKey算法安全性弱于PBKDF2,建议优先选择方案1。
修正后的兼容脚本
添加环境判断,自动适配不同的OpenSSL版本:
#!/bin/bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" # password_file="$SCRIPT_DIR/test_passfile_2.ssl" password_file="U2FsdGVkX18RH4KXM5Ldz0Q2ny8RQegoaDPObu50Y6k=" salt_password="salt password" # 检查OpenSSL是否支持pbkdf2参数 supports_pbkdf2=$(openssl enc -help 2>&1 | grep -q pbkdf2 && echo 1 || echo 0) # Decrypt password file or encrypted passwrod string if provided if [ -n "$password_file" ]; then if [ -f "$password_file" ]; then echo "Decrypting password file using salt password..." if [ $supports_pbkdf2 -eq 1 ]; then pwd=$(cat "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass "pass:$salt_password") else pwd=$(cat "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -salt -pass "pass:$salt_password") fi else echo "Decrypting password string using salt password..." if [ $supports_pbkdf2 -eq 1 ]; then pwd=$(echo "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass "pass:$salt_password") else pwd=$(echo "$password_file" | openssl enc -aes-256-cbc -md sha512 -a -d -salt -pass "pass:$salt_password") fi fi esc() { printf "%s" "$1" | sed -e "s/'//g" } password=$(esc "${pwd}") unset pwd if [ $? -ne 0 ]; then echo "Error: Failed to decrypt password." exit 1 fi echo "Password decrypted successfully." fi echo $password # Should output 'test'
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

