我应该在进入数据库之前加密AES-256-CBC中的IV和Key吗?

时间:2016-01-19 15:43:02

标签: php cryptography aes

我已经开始在我的PHP网站中使用AES-256-cbc加密敏感数据。

现在,用户之间的个人消息必须先加密才能存储到数据库中,我正在使用MySQL。

我使用openssl_random_pseudo_bytes(32)生成随机密钥和openssl_random_pseudo_bytes(openssl_cipher_iv_length(AES_256_CBC))
用于生成IV,我将附加到加密的结果字符串。

但是当我看到键和iv的实际字符串时,我发现它们不是纯文本。因此将它们存储到我的数据库中可能会有点问题,并且携带该数据也不会那么容易。现在,我应该做什么像散列静脉注射,他们键入md5或sha256?或者也许是bcrypt?我是否应该对整个加密字符串进行base64编码?

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您必须问自己:加密数据有什么意义?

您希望保护数据库中静止的数据,因此任何获得数据库转储的人都无法获得有关消息的任何见解。但是,在您的应用中,您需要显示这些消息。

因此,如果您将密钥与加密数据一起存储在数据库中,那就毫无意义了。无论如何,您将使用哪个密钥来加密密钥?你会将它存储在数据库中吗?

因此,您必须确保获得数据库访问权限的任何人都无法看到AES密钥。您需要将密钥存储在应用程序端的某个位置。从数据库中读取加密数据,并在内存中的应用程序主机上对其进行加密。您可以使用配置文件,密钥环,无论如何。

这是基本用例。但是,由于您正在加密可能变大的消息并因此加密大量数据,因此为每条消息创建新密钥可能确实是个好主意。然后,您将使用一个主密钥加密消息加密密钥,然后将其与消息一起存储在数据库中。前一段同样适用。

IV根本不敏感,您可以按原样存储。

关于编码问题:由于IV和密钥的字节可以包含所有可能的值,因此可打印字符串不适合使用数据库中的某种二进制存储。