我正在编写一个 php 脚本并使用 mcrypt 来加密/解密任意数据。
当我使用另一个 key 解密加密数据时(例如,我输入了错误的密码),当然无法正确解密输出。
如果使用了错误的 key ,我想显示一条错误消息,但我认为很难将输出字符串验证为正确的“纯文本”(因为编码数据中的字符作为输入也有效数据)。
有什么办法可以解决这个问题吗?
当我写这个问题时,我有了一个想法:)
我能否在输入数据前加上静态“控制”字符串并在解密时使用它进行验证?
最佳答案
我通常这样做:
- 散列输入数据(文件或消息或其他)。
- 加密数据。
- 在加密数据前加上数据的 IV 和哈希值。
- 发送或存储 IV + 哈希 + 密文。
由于 IV 和散列的长度始终相同,因此无需添加填充或控制字符。
在接收端或读取端:
- 提取 IV。
- 提取哈希。
- 提取并解密加密文本。
- 对解密数据进行哈希处理,并检查它是否与提取的哈希匹配。
因此,您存储的是源数据的哈希值,而不是 key 的哈希值。正如上面发表的评论者所说,泄露您的 key 的哈希是一个漏洞,因为攻击者现在只需要在彩虹表中搜索它(它会在几秒钟内危及您的数据)。
您存储控制字符串的想法也不错(当然更快),但它不能让您确认消息或数据确实未损坏,只是使用了正确的 key 。
关于PHP mcrypt_decrypt - 我可以确定数据是否使用正确的 key 解密吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7292658/