具有自定义盐的 OpenSSL 3.0.2 不以 Salted__ 开头
OpenSSL 3.0.2 with custom salt doesn't start with Salted__
我刚刚将我的 Ubuntu 系统升级到 OpenSSL 3.0.2 附带的 22.04。以前我使用的是 1.1.1f,似乎行为发生了变化,但我不确定 (1) 为什么以及 (2) 如何获得旧行为或新行为是什么,以便我可以适应它。
问题是我希望任何 openssl 加密文件都以字节开头:Base64 中的“Salted__”或“U2FsdGVkX1”。我用它来确定文件是否加密。
如果我将 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.1f 上,我可以这样做并得到:
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(从 alpha of/before 3.0.0 到 3.0.3) ;见 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
实际的密文是相同的,如果您分别删除或重新插入前 16 个字节,1.x.x 文件可以被 3.x 或 vice-versa 解密;唯一的区别是前 16 个字节是否存在,这使得 base64 看起来 不同,因为 16 不是 3.
的倍数
我刚刚将我的 Ubuntu 系统升级到 OpenSSL 3.0.2 附带的 22.04。以前我使用的是 1.1.1f,似乎行为发生了变化,但我不确定 (1) 为什么以及 (2) 如何获得旧行为或新行为是什么,以便我可以适应它。
问题是我希望任何 openssl 加密文件都以字节开头:Base64 中的“Salted__”或“U2FsdGVkX1”。我用它来确定文件是否加密。
如果我将 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.1f 上,我可以这样做并得到:
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(从 alpha of/before 3.0.0 到 3.0.3) ;见 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
实际的密文是相同的,如果您分别删除或重新插入前 16 个字节,1.x.x 文件可以被 3.x 或 vice-versa 解密;唯一的区别是前 16 个字节是否存在,这使得 base64 看起来 不同,因为 16 不是 3.
的倍数