PHP mcrypt_decrypt-我可以确定数据是否使用正确的密钥解密吗?
我正在编写一个php脚本,并使用mcrypt对任意数据进行加密/解密 当我使用另一个密钥(例如,我输入了错误的密码)解密加密数据时,输出当然不会被正确解密 如果使用了错误的键,我希望显示错误消息,但我认为很难验证输出字符串是否为正确的“明文”(因为编码数据中的字符也作为输入数据有效) 有没有办法绕过这个问题PHP mcrypt_decrypt-我可以确定数据是否使用正确的密钥解密吗?,php,validation,mcrypt,Php,Validation,Mcrypt,我正在编写一个php脚本,并使用mcrypt对任意数据进行加密/解密 当我使用另一个密钥(例如,我输入了错误的密码)解密加密数据时,输出当然不会被正确解密 如果使用了错误的键,我希望显示错误消息,但我认为很难验证输出字符串是否为正确的“明文”(因为编码数据中的字符也作为输入数据有效) 有没有办法绕过这个问题 当我写这个问题时,我有了一个想法:) 我是否可以在输入数据前面加上一个静态“control”字符串,并在解密时使用它进行验证 我通常这样做: 散列输入数据(文件、消息或其他) 加密数据
当我写这个问题时,我有了一个想法:) 我是否可以在输入数据前面加上一个静态“control”字符串,并在解密时使用它进行验证 我通常这样做:
- 散列输入数据(文件、消息或其他)
- 加密数据
- 用IV和数据的散列作为加密数据的前缀
- 发送或存储IV+哈希+密文
- 拔出静脉输液管
- 提取散列
- 提取并解密加密文本
- 对解密的数据进行散列,并检查其是否与提取的散列匹配
存储控制字符串的想法也不错(当然更快),但它不能让您确认消息或数据确实没有损坏,只能确认使用了正确的密钥。为加密数据添加完整性的最佳方法是添加仅在加密数据上创建的MAC 不要将MAC应用于纯文本,因为MAC可以显示有关该文本的一些信息。创建MAC并不是为了提供仅安全的完整性 所以,正确的算法应该是ENCRYPT-THEN-MAC
本视频中提供了更详细的信息您是否考虑过在解密前使用散列来验证密钥?编辑:我没有保存密钥的任何校验和(在数据库等中),因此在我的情况下不能这样做,对吗?基本上,除了加密数据之外,您还存储原始密钥的散列。然后,在使用给定密钥解密加密数据之前,使用相同的哈希算法计算给定密钥的哈希值,并将结果与存储的哈希值进行比较。如果散列相同,则键也(很可能)相同。(另请参见)我不建议在加密数据之外存储密钥的散列。如果攻击者只需在散列中尝试密码,而不是解密整个文件,那么使用bruteforce可以更容易地找出密码。另一种方法是在对原始数据进行编码之前将散列预加到原始数据中。我用的是:是的,这是另一种方式。只要“控制引用”字符串只能用正确的加密密钥恢复或匹配(或两者都匹配),它就可以工作。即使使用链接代码,也只使用了散列的一小部分。(然而,我想知道为什么您只使用了散列中的四个字节;散列越短,冲突的可能性就越高。应用程序中的空间/大小限制可能是吗?)。毕竟,数据必须是一致的。如果是-那么它是正确的,否则它根本不会解密。例如,在我的场景中,如果解密成功与否,我使用它来评估值。如果是的话,那么我认为它是可信的。另一个关于座谈会的例子是点击银行收据号码。他们只有8个字符,这足够他们所有的销售历史。你好,安东。