我正在开发一个php脚本,正在使用mcrypt来加密/解密任意数据。
当我使用另一个密钥解密加密数据时(例如我输入了错误的密码),当然输出将无法正确解密。
如果使用了错误的密钥,我想显示错误信息,但我认为将输出字符串验证为正确的“明文”非常困难(因为编码数据中的字符也有效作为输入数据)。
有没有办法解决这个问题?
当我写这个问题时,我有了一个想法:)
我可以使用静态“控制”字符串为输入数据添加前缀,并在解密时将其用于验证吗?
答案 0 :(得分:1)
我通常这样做:
由于IV和散列的长度始终相同,因此无需添加填充或控制字符。
在接收或阅读方面:
因此,您存储源数据的哈希值,而不是密钥的哈希值。作为上面发布的评论者,泄露密钥的散列是一个漏洞,因为攻击者现在只需要在彩虹表中搜索它(它会在几秒钟内危及您的数据)。
您对存储控制字符串的想法也很好(当然更快)但它不能让您确认消息或数据确实没有损坏,只是使用了正确的密钥。
答案 1 :(得分:0)
为加密数据添加完整性的最佳方法是添加仅在加密数据上创建的MAC。
不要在纯文本上应用MAC,因为MAC可以显示有关该文本的一些信息。创建MAC不是为了提供安全性 - 仅提供完整性。
所以,正确的算法将是ENCRYPT-THEN-MAC!
此视频中提供了更详细的信息http://d396qusza40orc.cloudfront.net/crypto/recoded_videos%2F7.4%20%5B974a4c90%5D%20.mp4