PHP mcrypt_decrypt -我可以确定数据是否用正确的密钥解密


PHP mcrypt_decrypt - can I determine if data is decrypted with the right key?

我正在编写一个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