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

时间:2011-09-03 10:48:48

标签: php validation mcrypt

我正在开发一个php脚本,正在使用mcrypt来加密/解密任意数据。

当我使用另一个密钥解密加密数据时(例如我输入了错误的密码),当然输出将无法正确解密。

如果使用了错误的密钥,我想显示错误信息,但我认为将输出字符串验证为正确的“明文”非常困难(因为编码数据中的字符也有效作为输入数据)。

有没有办法解决这个问题?


当我写这个问题时,我有了一个想法:)

我可以使用静态“控制”字符串为输入数据添加前缀,并在解密时将其用于验证吗?

2 个答案:

答案 0 :(得分:1)

我通常这样做:

  • 哈希输入数据(文件或消息或其他)。
  • 加密数据。
  • 使用IV和数据哈希预先加密数据。
  • 发送或存储IV + hash + ciphertext。

由于IV和散列的长度始终相同,因此无需添加填充或控制字符。

在接收或阅读方面:

  • 提取IV。
  • 提取哈希。
  • 提取并解密加密文本。
  • 散列解密数据并检查它是否与提取的散列匹配。

因此,您存储源数据的哈希值,而不是密钥的哈希值。作为上面发布的评论者,泄露密钥的散列是一个漏洞,因为攻击者现在只需要在彩虹表中搜索它(它会在几秒钟内危及您的数据)。

您对存储控制字符串的想法也很好(当然更快)但它不能让您确认消息或数据确实没有损坏,只是使用了正确的密钥。

答案 1 :(得分:0)

为加密数据添加完整性的最佳方法是添加仅在加密数据上创建的MAC。

不要在纯文本上应用MAC,因为MAC可以显示有关该文本的一些信息。创建MAC不是为了提供安全性 - 仅提供完整性。

所以,正确的算法将是ENCRYPT-THEN-MAC!

此视频中提供了更详细的信息http://d396qusza40orc.cloudfront.net/crypto/recoded_videos%2F7.4%20%5B974a4c90%5D%20.mp4