我正在使用mysql并使用AES_ENCRPYT
函数来存储一些机密数据。所以aes加密数据存储字段是varchar
但是当我插入一些数据并检查数据库时,它看起来像是一些wiered字符i³£ÓXñÒOýpŠ
..但是当我将数据类型更改为varbinary时,它显示为二进制字符串,如69b3a3d358f1d24ffd708a0cafdbdbd8
。我正在使用PHP和MYSQL
所以我的问题是
必须使用哪种数据类型来存储加密数据。 varchar
或varbinary
。为什么。?
另外如何进行256字节的aes加密。?
我找到了一些参考文献 here ,说明
为什么我们使用VARBINARY数据类型而不是VARCHAR:
因为AES_ENCRYPT()
加密字符串并返回二进制字符串。
答案 0 :(得分:2)
AES是一种分组密码。像所有现代密码一样,AES - 在任何操作模式(如CBC)中 - 只有接受二进制输入并产生二进制输出。这意味着如果需要加密字符串(例如UTF-8),则必须执行character-encoding。如果要将结果存储为文本,则必须使用encoding(例如base 64)。有时,实现已经隐式为您执行此类编码,但大多数情况下用户必须自己执行此操作。
密码的输出应该与攻击者无法区分。这意味着没有理由将AES的输出存储在数据库中的字符串中;除了解密之外,您无法对输出执行任何操作。如果之后需要文本中的密文,则始终可以将二进制文件转换为特定的编码。对于正常的可变大小的输入,varbinary
最好,因为输出大小取决于输入大小。
仅在需要时才对字符串执行转换。
请注意,任何编码都会扩展密文的大小; base 64对于每6位密文使用8位(假设ASCII兼容编码),扩展为33%。因此,除了转换数据使得密文的处理变得复杂之外,它还将增加所需的存储量。