在unix系统上,我使用OpenSSL AES-256-CBC加密文件:019 > ActiveSupport::Inflector.ordinalize(time.day)
:=> "5th"
解密通过:022 > time.to_formatted_s(:long_ordinal)
=> "August 5th, 2016 17:59"
有没有办法验证在实际启动解密过程之前,秘密是否正确?
到目前为止,我的研究没有显示任何有用的结果。
答案 0 :(得分:1)
如果您拥有的只是加密数据,则在解密之前无法确定密钥是否正确。除了通过检查数据是否有意义之外,还无法确定解密后密钥是否正确,这是您所期望的。
您必须添加一些其他方法来确定密钥是否正确。
答案 1 :(得分:0)
您要求的是检查完整性和/或真实性。 CBC模式下的AES不提供这些功能,只提供普通加密/解密。
如果需要,您应该从CBC切换到GCM模式。它在解密时提供真实性和完整性检查。因此,如果解密成功,您确定解密结果是正确的。
答案 2 :(得分:0)
如果这是您的整个系统,那么不,OpenSSL没有任何机制来在解密之前检查密码(或者在许多情况下甚至在解密之后)。但是,您可以构建这样一个系统,如果您受限于此,甚至可以使用OpenSSL构建它。
如果我们用OpenSSL构建它,那么解决它的绝对最简单的方法就是用相同的密码加密一些已知的数据。将加密的已知明文和加密的实际明文粘合在一起。你可以把它们粘在一起很多方面;最简单的命令行形式是将它们粘贴在单独的文件中,然后tar
将它们放在一起。
当你准备好解密时,将它们拆开,然后尝试解密已知明文。如果它正确解密,那么你就是黄金,你可以解密你的真实数据。
OpenSSL没有特别强大的KDF,因此这种方法可以使暴力破解密码更容易(尽管不比文件中有一些已知的标题容易)。
然而,这并不能确保密文不变。攻击者仍然可以修改它,而OpenSSL并不总是知道。有一些方法可以通过进一步修改格式来解决这个问题,但是再次openssl并没有提供我所知道的任何直接方式。这里最好的方法取决于你的确切约束。