varbinary或varchar用于保存AES加密数据

时间:2013-12-21 10:56:58

标签: mysql sql database encryption aes

我正在使用mysql并使用AES_ENCRPYT函数来存储一些机密数据。所以aes加密数据存储字段是varchar但是当我插入一些数据并检查数据库时,它看起来像是一些wiered字符i³£ÓXñÒOýpŠ ..但是当我将数据类型更改为varbinary时,它显示为二进制字符串,如69b3a3d358f1d24ffd708a0cafdbdbd8。我正在使用PHP和MYSQL

所以我的问题是

必须使用哪种数据类型来存储加密数据。 varcharvarbinary。为什么。?

另外如何进行256字节的aes加密。?

我找到了一些参考文献 here ,说明

为什么我们使用VARBINARY数据类型而不是VARCHAR:

因为AES_ENCRYPT()加密字符串并返回二进制字符串。

1 个答案:

答案 0 :(得分:2)

AES是一种分组密码。像所有现代密码一样,AES - 在任何操作模式(如CBC)中 - 只有接受二进制输入并产生二进制输出。这意味着如果需要加密字符串(例如UTF-8),则必须执行。如果要将结果存储为文本,则必须使用(例如base 64)。有时,实现已经隐式为您执行此类编码,但大多数情况下用户必须自己执行此操作。

密码的输出应该与攻击者无法区分。这意味着没有理由将AES的输出存储在数据库中的字符串中;除了解密之外,您无法对输出执行任何操作。如果之后需要文本中的密文,则始终可以将二进制文件转换为特定的编码。对于正常的可变大小的输入varbinary最好,因为输出大小取决于输入大小。

仅在需要时才对字符串执行转换。


请注意,任何编码都会扩展密文的大小; base 64对于每6位密文使用8位(假设ASCII兼容编码),扩展为33%。因此,除了转换数据使得密文的处理变得复杂之外,它还将增加所需的存储量。