You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:37:05