【问题标题】:varbinary or varchar to save AES encrypted datavarbinary 或 varchar 保存 AES 加密数据
【发布时间】:2014-01-10 04:17:53
【问题描述】:

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

所以我的问题是

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

另外如何做一个256字节的aes加密。?

我发现一些参考文献 here 指出

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

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

【问题讨论】:

  • 我总是使用 var binary 但 char 也可以。数据将是相同的
  • 使用二进制类型。字符类型受制于自动字符集转换,你会弄得一团糟。比如说表中的数据是utf8,但是客户端编码是latin1,所以MySql会自动将每一个é字符,用十六进制E9的latin1表示,转换成utf8中的c3+a9字节,并将这两个字节存入表中.然后想象另一个不支持 é 字符的编码不是 utf8 和 latin1 的客户端正在尝试解密这个字符串 - 并且会变得一团糟。

标签: mysql sql database encryption aes


【解决方案1】:

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

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

仅在需要时执行与字符串的转换。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2012-11-05
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2014-05-08
    相关资源
    最近更新 更多