我正在编写一个php脚本,并使用mcrypt加密/解密任意数据。
当我使用另一个密钥解密加密数据时(例如我输入了错误的密码),输出当然不会被正确解密。
如果使用了错误的密钥,我想显示一条错误消息,但我认为很难将输出字符串验证为正确的"明文"(因为编码数据中的字符也可以作为输入数据有效)。
有办法绕过这个吗?
当我在写这个问题的时候,我有了一个主意:
我可以可能前缀输入数据与一个静态的"控制"字符串,并使用这个验证,当我解密?
我通常这样做:
- 散列输入数据(文件或消息或其他)。
- 加密数据
- 在加密后的数据前加上IV和数据的哈希值
- 发送或存储IV +哈希+密文。
由于IV和hash总是相同的长度,因此不需要添加填充或控制字符。
接收方或阅读方:
- 提取哈希值
- 提取并解密加密文本。
- 对解密后的数据进行散列,并检查是否与提取的散列相匹配。
您存储控制字符串的想法也很好(当然更快),但它不能让您确认消息或数据确实未损坏,只有正确的键被使用。
为加密数据添加完整性的最佳方法是添加仅在加密数据上创建的MAC。
不要在纯文本上应用MAC,因为MAC会泄露文本的一些信息。MAC不是为了提供安全而创建的,只提供完整性。
所以,正确的算法应该是ENCRYPT-THEN-MAC!
更多详细信息请参见此视频http://d396qusza40orc.cloudfront.net/crypto/recoded_videos%2F7.4%20%5B974a4c90%5D%20.mp4