如何使用PHP中的AES-256-CBC通过适当的身份验证正确加密数据?

时间:2016-01-22 20:02:42

标签: php encryption cryptography aes

我一直在使用openssl函数在php中使用AES-256-CBC加密数据。我已经能够使用每个新加密的唯一IV(通过openssl_random_pseudo_bytes生成)对其进行加密。

但我正在努力解决使用aes cbc进行身份验证加密的想法。当我要解密数据时,我如何基本验证?

我需要使用像PBKDF2,blowfish或hash_hmac()这样的东西吗?

我是否需要以某种方式散列密钥?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

简单的解决方案,使用可用于php和许多其他语言的RNCryptor。有关实施细节,请参阅此ReadMe

即使您不使用RNCryptor,这些方法也是正确且安全的。

网站上的一些细节:

  • AES-256加密
  • CBC模式
  • 使用PBKDF2进行密码拉伸
  • 密码腌制
  • Random IV
  • 加密 - 然后哈希HMAC
  • 版本

答案 1 :(得分:1)

  

但我正在努力解决使用aes cbc进行身份验证加密的想法。当我要解密数据时,我如何基本验证?

使用随机IV加密数据后,使用第二个密钥将密文和IV放入hash_hmac()

如果您因为需要部署到生产中而要求,请等到defuse/php-encryption的第2版发布后再使用它。 (它的AES-256-CTR不是AES-256-CBC,但CTR模式的攻击面比CBC模式少;即如果你击败了HMAC,就没有填充oracle攻击。)

不要使用RNCryptor。

RNCryptor不是根据cryptography coding standards编写的,既不在PHP也不在Python

RNCryptor字面上violates rule 1 of the cryptography coding standards始终如一。可能还有其他尚未发现的问题。如果您希望跨语言移植,use libsodium