Openssl在Bash脚本中解密返回值异常的技术问询
OpenSSL 脚本中密码爆破返回值误判问题分析
核心原因:命令替换$(...)导致退出码被覆盖
你的脚本中直接用$(openssl enc -aes-256-cbc -pbkdf2 -d -in $2 -out $3 -pass pass:$pword)执行解密命令,这个写法的问题在于:
$(...)是命令替换,它会先执行openssl命令,再把命令的标准输出内容当作新的Shell命令去执行。- 密码错误时,OpenSSL解密失败,不会向标准输出(stdout)输出任何内容,只会向标准错误(stderr)输出
bad decrypt提示。 - 此时
$(...)捕获的stdout为空,相当于执行了一个“空命令”,而Shell执行空命令的退出码是0(表示成功),这直接覆盖了OpenSSL原本返回的退出码1,导致脚本误判密码正确。
命令行与脚本行为差异的根源
命令行直接执行openssl enc ...时,$?获取的是OpenSSL命令本身的退出码;但脚本中用命令替换后,$?获取的是执行命令替换输出内容的退出码,而非OpenSSL的退出码,这就造成了两者结果不一致。
额外验证说明
那些被误判的词汇(如abies、abkar)本质仍是错误密码,解密后的文件仍处于加密状态,说明OpenSSL实际解密失败,但脚本因为$(...)的写法错误,拿到了错误的退出码0。
修复方案
去掉命令替换,直接执行OpenSSL命令,这样$?就能正确获取OpenSSL的退出码:
echo "Current Pword is $pword" openssl enc -aes-256-cbc -pbkdf2 -d -in "$2" -out "$3" -pass pass:"$pword" if [ "$?" -eq 0 ] then echo "The password was found to be $pword " echo "$pword " >> pwords.out echo "The file was decrypted as $3 " exit 0 fi
同时建议给所有变量加上双引号,避免文件名、密码包含空格或特殊字符时出现意外问题。
内容的提问来源于stack exchange,提问作者dwhite
相关产品推荐
相关产品推荐

