【问题标题】:Use BLOB or VARBINARY for Encrypted Data in MySQL?在 MySQL 中使用 BLOB 或 VARBINARY 加密数据?
【发布时间】:2013-04-05 11:48:55
【问题描述】:

我正在开发一个通过文本区域接受用户输入的 PHP 应用程序。它将加密存储在数据库中(使用 AES_ENCRYPT)。

我应该使用 BLOB 还是 VARBINARY 字段?这两种类型的字段是否会影响性能?

【问题讨论】:

  • AES_ENCRYPT() 和 AES_DECRYPT() 启用使用官方 AES(高级加密标准)算法(以前称为“Rijndael”)对数据进行加密和解密。使用 128 位密钥长度进行编码,但您可以通过修改源将其扩展到 256 位。我们选择了 128 位,因为它速度更快,并且对于大多数用途来说足够安全。 dev.mysql.com/doc/refman/5.1/en/…

标签: mysql database-design schema relational-database


【解决方案1】:

BLOB 和 VARBINARY 都是“字符串”数据类型,它们存储 二进制 字符串(实际上是字节数组),这与通常的字符串类型相反,它们存储 字符 字符串, 字符集编码等。

在大多数情况下,您可以将 BLOB 列视为 VARBINARY 列,可以任意大。

BLOB 在以下方面与 VARBINARY 不同:

  • 在存储或检索值时,不会删除 BLOB 列的尾随空格。
  • 对于 BLOB 列上的索引,您必须指定索引前缀长度。
  • BLOB 列不能有 DEFAULT 值。

使用 BLOB,因为如果您的加密值恰好以空格字节(十六进制 20)结尾,它将被 VARBINARY 截断,从而有效地破坏您的值。此外,您不会在加密值上放置索引,因此索引问题无关紧要,您也不会有默认值。

【讨论】:

  • 根据我对the doc 的理解,不会从 VARBINARY 中删除尾随空格
【解决方案2】:

我认为 Bohemian 的回答并不准确。 VARBINARY 像 BLOB 一样是存储二进制数据,因此它能够存储 any 数据,包括空格。

    mysql> create table t1 (id integer auto_increment, data varbinary(100), primary key (id));
Query OK, 0 rows affected (0.09 sec)

// inserting '0', ' ', '0', ' ' - 4 characters including trailing space
mysql> insert into t1 (data) values (unhex('30203020')); 
Query OK, 1 row affected (0.02 sec)

+----+------+
| id | data |
+----+------+
|  1 | 0 0  |
+----+------+
1 row in set (0.00 sec)

mysql> select t1.*, length(data) from t1;
+----+------+--------------+
| id | data | length(data) |
+----+------+--------------+
|  1 | 0 0  |            4 |
+----+------+--------------+
1 row in set (0.00 sec)

【讨论】:

  • Bohemian's answer 中隐含的断言是从​​ VARBINARY 中删除了 尾随 空格。基于the doc,这个断言对我来说似乎是错误的,但并没有被所示的测试证明。
  • @elsouf:所以您的(改进的)实验和the doc 确认Bohemian's answer 中的建议是基于不正确 前提在 MySQL 中,从 VARBINARY 中删除尾随空格。
猜你喜欢
  • 2014-01-10
  • 2012-01-18
  • 1970-01-01
  • 2018-03-22
  • 2017-01-24
  • 2018-11-13
  • 1970-01-01
  • 2019-12-04
  • 2015-04-12
相关资源
最近更新 更多