如题,在 windows 上测试正常的 AES 加密脚本,放到构建平台(linux docker)上执行后产出的内容,无法被客户端解密。错误提示大致如下:
bad decrypt
232864:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto\evp\evp_enc.c:541:
在经过反复对比测试后发现,在 windows 上加密的内容可以自行解密,但放到 linux docker 中则解密失败;反之亦然,在 linux 上加密的内容可以自行解密,放到 windows 上则解密失败。
由于执行的是由 nodejs 编写的同一脚本,唯一不同的就是调用了 OpenSSL(其版本不同),那么应该是 OpenSSL 的差异导致的。可是为什么会有这种差异?
经过反复搜索查阅,在该文章【OpenSSL AES 算法中 Key 和 IV 是如何生成的?】中介绍了 OpenSSL AES-256-CBC
算法生成 KEY 与 IV 的具体逻辑,其中指出了 OpenSSL 1.1.0 版本前后使用的默认 digest 摘要算法改变了:1.1.0 版本之前默认使用 md5,而之后使用 sha256。
在结合官方仓库的提交验证后,前面遇到的问题原因就很明显了。解决方法则是明确指定要使用的消息摘要类型,即增加 -md
参数指定 hash 函数类型即可。示例如下:
# 将 app.asar 加密为 app.enc openssl enc -e -md sha256 -aes-256-cbc -salt -in app.asar -out app.enc -pass pass:123456789 -p # 将 app.enc 解密为 app.asar openssl enc -d -md sha256 -aes-256-cbc -salt -in app.enc -out app.asar -pass pass:123456789 -p
相关参考: