我正在编写一个小类来添加到我的应用程序中,它将处理诸如配置秘密之类的事情。(我不想进入这个话题,因为很多研究已经深入到我们决定为此采取的方法上。)
其中一个要求是对文件机密进行加密。(假设是TLS证书密钥或PGP密钥。)我能够生成(并解密)一个秘密密钥,该密钥可用于使用AWS KMS服务对应用程序之外的文件进行加密/解密。(有关实际返回的信息,请参见此:https://docs.aws.amazon.com/cli/latest/reference/kms/generate-data-key.html)
所以,按照我的想法,这仅仅意味着我需要将加密的密钥与文件一起存储,这样我就可以解密密钥,使用它来解密文件时。
我的困惑来自于由于IV而对文件数据使用了openssl加密/解密函数。在过去的几天里,我阅读了很多关于IV的内容,并理解了它的一般用途,但我仍然有许多问题试图将它与我在“现实世界”中看到的东西调和起来。
当我从命令行使用openssl对文件进行加密时,我已经阅读了以下内容:
openssl aes-256-cbc -salt -in secrets.txt -out secrets.txt.enc
注意,没有传入IV,尽管-salt参数可能具有类似的用途?
但是,当我解密同一个文件时,我使用如下命令:
openssl aes-256-cbc -d -in secrets.txt.enc -out secrets.txt.new
注意没有-salt参数,没有IV,或者任何类似的东西,那么它如何能够在没有这些信息的情况下解密文件呢?
在PHP中的openssl加密/解密函数以及围绕IV的其他讨论中,似乎强烈建议在加密数据时使用IV,这意味着我在解密数据时也需要存储/使用IV,但这不是从命令行执行的,那么这是如何工作的呢?上面的命令行是否不太安全?我是否需要使用一个IV,因为每个文件都有自己的安全加密密钥?
发布于 2016-09-02 07:11:29
如本线程所述
OpenSSL开发人员倾向于从密码中派生IV,就像密钥一样(也就是说,他们从密码中产生一个长序列,他们将其分成两部分,一半是加密密钥,另一半是IV)。
不需要为解密提供IV,因为OpenSSL从密码中派生它。线程还提到了使用OpenSSL的文件加密方法的一些缺点,这是值得考虑的,比如没有MAC来验证加密文件的完整性。
https://security.stackexchange.com/questions/135708
复制