PHP-加密:测试字符串是否已正确解密?

这是一种理论上的理论,不仅适用于PHP,而且可能适用于更多语言.

假设我使用AES-256密码和mcrypt库对字符串进行加密.现在,已加密的字符串看起来类似于þøÆ{”ò(ü´îÚÜÇW¹ËŸK­¯L´rø?ª¶!JF£­ºŒ´Ú’,.

如果加密密钥将在解密和加密事件之间改变,则解密结果显然将毫无价值.
由于至少对我来说,一个加密的字符串包含随机字符,因此对它进行某种测试以确保它处于加密/解密状态并不容易.

我花了一些时间思考.如何测试字符串已正确解密?
如果我先对原始字符串附加一个小前缀,然后再对其进行加密,然后在解密时删除该前缀,该怎么办.如果找不到此前缀,可以肯定地说解密失败.

这是处理此问题的合适方法吗?

解决方法:

要测试数据完整性,您需要一个Message Authentication Code(MAC).

有一些独立的MAC算法,看起来像带有密钥的哈希函数.非常标准的MAC算法是HMAC(使用哈希函数).

由于还对数据进行了加密,因此,您将希望使用带有内置MAC的加密模式.有一些这样的模式,例如GCMEAX.这些模式适用于分组密码,通常是AES.

在加密之前将已知的前缀或后缀添加到数据是自制MAC. MAC是微妙的并且容易出错.例如,如果添加一个CRC32,然后使用流密码(或CTR模式下的分组密码)进行加密,则您正在复制the seven capital sins of WEP中的一个(特别是关于CRC32-as-MAC问题,请参阅第4节).基本上,您的完整性检查不再能够抵抗主动攻击.您只是在检测无辜的错误,例如使用错误的键.

(不幸的是,MCrypt似乎不支持任何组合的加密/ MAC模式.使用–with-mhash选项编译时,PHP本身提供了同时实现原始哈希和HMAC的mhash()函数.)

上一篇:c#-操作数类型冲突:varchar与试图插入加密数据库中的varchar(50)不兼容


下一篇:在PHP中解密A256GCM加密的JWT