带有自定义盐的 OpenSSL 3.0.2 不是从 Salted__ 开始的



我刚刚将我的Ubuntu系统升级到22.04,它附带了OpenSSL 3.0.2。以前我使用的是1.1.1f,似乎行为已经改变,但我不确定(1)为什么(2)如何获得旧的行为或新的行为是什么,所以我可以适应它。

问题是我期望任何openssl加密文件以字节开头:"Salted__"或";U2FsdGVkX1"Base64。我用它来确定文件是否加密。

如果我使用OpenSSL 3随机生成的盐,事情会很好。

echo "foo" >secret.txt
ENC_PASS=chbs openssl enc -aes-256-cbc -md sha256 -pass env:ENC_PASS -e -pbkdf2 -in secret.txt -a

结果:

U2FsdGVkX1+BM+juJUWhy5eqBJ3k5BrrTs/V4l0QstA=

我得到了版本1.1.1f类似的结果,但它是随机的,所以它是不确定的。

然而,在我正在开发的应用程序中,我需要确定性,所以我需要提供盐。这没什么大不了的,openssl允许您在-S中这样做。在1.1.1上,如果我可以这样做并得到:

ENC_PASS=chbs openssl enc -aes-256-cbc -md sha256 -pass env:ENC_PASS -e -S 5555555555555555 -pbkdf2 -in secret.txt -a
U2FsdGVkX19VVVVVVVVVVQkK+WIxriO4aZHXlxJOzDg=

这是确定性的,所以你可以使用我所做的相同的秘密并得到相同的结果。

但是在3.0.2上使用相同的命令我得到:

CQr5YjGuI7hpkdeXEk7MOA==

这也是确定性的,但为什么不同呢?似乎没有一致的模式。

发生了什么事?他们停止在信息前加盐了吗?如果我想要的话,我需要手动添加吗?我能做些什么让openssl再为我做一次吗?行为改变的原因是什么?

这不是真正的编程或开发,因此应该离题,但既然你让我看:

是的,它改变了,不是指3.0.2,而是所有3.0。X(从3.0.0到3.0.3之前的alpha为/);参见https://github.com/openssl/openssl/commit/c4c8791e145a7cb2d59e73410505e36e4d57ff78。现在当你使用-S时,它不再写读取由Salted__加8字节盐组成的16字节。

没有选项可以控制这个。当然,因为OpenSSL是开源的,你可以按照自己的意愿进行分支和修改,只要你不违反许可证发布它。

明显的base64差异仅仅是这个结果。

$ <<<U2FsdGVkX19VVVVVVVVVVQkK+WIxriO4aZHXlxJOzDg= openssl base64 -d |xxd
00000000: 5361 6c74 6564 5f5f 5555 5555 5555 5555  Salted__UUUUUUUU
00000010: 090a f962 31ae 23b8 6991 d797 124e cc38  ...b1.#.i....N.8
$ <<<CQr5YjGuI7hpkdeXEk7MOA== openssl base64 -d |xxd
00000000: 090a f962 31ae 23b8 6991 d797 124e cc38  ...b1.#.i....N.8

实际的密文是相同的,并且是1.x。X文件可以被3解密。X,反之亦然,如果分别删除或重新插入前16个字节;唯一的区别是前16个字节是否存在,这使得base64看起来不同,因为16不是3的倍数。

最新更新