我曾在 Amazon Linux 2 VM 上使用 OpenSSL 加密文件,如下所示:
openssl aes-256-cbc -salt -out ~/my_file.txt.enc -pass pass:[redacted]
但是,当使用以下命令在 OSX 上解密文件时,我一直收到“Bad Decrypt”提示。
openssl aes-256-cbc -d -salt -in ~/my_file.txt.enc -pass pass:[redacted] > my_file.txt
在 OSX 上使用 LibreSSL 和在 Linux 上使用 OpenSSL 的解密过程是否存在差异,或者我在解密过程中是否遇到了其他错误?
答案1
根据您在评论中提供的版本,听起来@MattCaswell 指出的应该是真正的罪魁祸首:OpenSSL 在 1.1.0 版中将默认摘要从 md5 更改为 sha-256,请参阅文档. 由此可知,你的1.0.2k版本一定是用了md5 digest。
尝试将其-md md5
作为参数传递给解密命令来解密旧文件,如下所示:
openssl aes-256-cbc -d -salt -md md5 -in ~/my_file.txt.enc -pass pass:[redacted] > my_file.txt
如果您正在加密新文件,最好添加-md sha-256
加密命令,以保持其更具可移植性,因为新版本默认使用该命令(并且 sha-256 可能比旧的 md5 更安全)。
更新
忽略之前的更新(下面划掉),事实证明 openssl 1.0.2 和 LibreSSL 3.3.6 都默认使用旧的密钥派生函数,不过,无论如何,添加-pbkdf2
加密和解密命令都是一个好主意,以便使用更好的密钥派生函数。
关于实际问题,我尝试了您提到的确切版本,并且这两种组合都可以工作(在 1.0.2k-fips 中加密,在 LibreSSL 3.3.6 中解密):
使用 md5 (在 LibreSSL 1.0.2k-fips 中没有额外参数-md md5
):
cat test.txt | openssl aes-256-cbc -salt -out test.enc -pass pass:passwd
openssl enc -d -aes-256-cbc -pass pass:passwd -md md5 -in ~/test.enc
使用 sha256 (-md sha256
在 openssl 1.0.2k-fips 中,在 LibreSSL 中没有参数):
cat test.txt | openssl aes-256-cbc -salt -md sha256 -out test2.enc -pass pass:passwd
openssl enc -d -aes-256-cbc -pass pass:passwd -in ~/test2.enc
所以看起来这个选项应该真的有帮助。你能再检查一下你的命令吗,也许你输入了错误的密码或检查了错误的文件?当然,为了安全起见,在加密和解密时都md md5
使用该选项也无妨。-md xxx
根据您-md md5
没有帮助的评论,这似乎不是唯一的问题。此外,似乎较新的版本正在使用 PBKDF 密钥派生函数,而较旧的版本(例如 1.0.2)未使用该函数。
当然,最好的方法是将您的 amazon Linux 更新到较新的版本,并使用更安全的 PBKDF 算法。
如果这不可能,您可以使用实际密钥和 iv 进行加密和解密,而不是密码(通过密钥派生函数将其转换为密钥和 iv,这在新旧 openssl 中有所不同)。假设您有一个很好的随机源,而不是传递-pass pass:[redacted]
,而是使用-K <64 random hex characters>
和-iv <32 random hex characters>
,并在加密和解密中传递相同的密钥和 iv。
当然,这是假设您想要一个在 amazon linux 中加密并在 osx 中解密的命令。如果您已经拥有加密文件并想在 OSX 中解密它们,则需要找到一种方法从旧密码中提取实际密钥和 iv(不确定旧版 openssh 使用了什么算法,但我认为它是某种简单的哈希,需要进行一些研究)。