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

PHP mcrypt_decrypt-我可以确定数据是否使用正确的密钥解密吗?,php,validation,mcrypt,Php,Validation,Mcrypt,我正在编写一个php脚本,并使用mcrypt对任意数据进行加密/解密 当我使用另一个密钥(例如,我输入了错误的密码)解密加密数据时,输出当然不会被正确解密 如果使用了错误的键,我希望显示错误消息,但我认为很难验证输出字符串是否为正确的“明文”(因为编码数据中的字符也作为输入数据有效) 有没有办法绕过这个问题 当我写这个问题时,我有了一个想法:) 我是否可以在输入数据前面加上一个静态“control”字符串,并在解密时使用它进行验证 我通常这样做: 散列输入数据(文件、消息或其他) 加密数据

我正在编写一个php脚本,并使用mcrypt对任意数据进行加密/解密

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

如果使用了错误的键,我希望显示错误消息,但我认为很难验证输出字符串是否为正确的“明文”(因为编码数据中的字符也作为输入数据有效)

有没有办法绕过这个问题


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

我是否可以在输入数据前面加上一个静态“control”字符串,并在解密时使用它进行验证

我通常这样做:

  • 散列输入数据(文件、消息或其他)
  • 加密数据
  • 用IV和数据的散列作为加密数据的前缀
  • 发送或存储IV+哈希+密文
由于IV和hash总是相同的长度,因此不需要添加填充字符或控制字符

在接收或读取端:

  • 拔出静脉输液管
  • 提取散列
  • 提取并解密加密文本
  • 对解密的数据进行散列,并检查其是否与提取的散列匹配
因此,存储源数据的散列,而不是键的散列。正如上面的一位评论者所说,泄露密钥的散列是一个漏洞,因为攻击者现在只需在rainbow表中搜索它(它会在几秒钟内破坏您的数据)


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

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

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

所以,正确的算法应该是ENCRYPT-THEN-MAC


本视频中提供了更详细的信息

您是否考虑过在解密前使用散列来验证密钥?编辑:我没有保存密钥的任何校验和(在数据库等中),因此在我的情况下不能这样做,对吗?基本上,除了加密数据之外,您还存储原始密钥的散列。然后,在使用给定密钥解密加密数据之前,使用相同的哈希算法计算给定密钥的哈希值,并将结果与存储的哈希值进行比较。如果散列相同,则键也(很可能)相同。(另请参见)我不建议在加密数据之外存储密钥的散列。如果攻击者只需在散列中尝试密码,而不是解密整个文件,那么使用bruteforce可以更容易地找出密码。另一种方法是在对原始数据进行编码之前将散列预加到原始数据中。我用的是:是的,这是另一种方式。只要“控制引用”字符串只能用正确的加密密钥恢复或匹配(或两者都匹配),它就可以工作。即使使用链接代码,也只使用了散列的一小部分。(然而,我想知道为什么您只使用了散列中的四个字节;散列越短,冲突的可能性就越高。应用程序中的空间/大小限制可能是吗?)。毕竟,数据必须是一致的。如果是-那么它是正确的,否则它根本不会解密。例如,在我的场景中,如果解密成功与否,我使用它来评估值。如果是的话,那么我认为它是可信的。另一个关于座谈会的例子是点击银行收据号码。他们只有8个字符,这足够他们所有的销售历史。你好,安东。