包含加密数据的BLOB上的索引

时间:2013-02-15 17:05:07

标签: mysql encryption indexing blob aes

我在表中有一堆BLOB类型的列。这些列中包含的数据使用MySQL的AES_ENCRYPT()函数加密。其中一些字段正在我正在构建的应用程序的搜索部分中使用。将索引放在经常访问的列上是否值得?我不确定它们是BLOB还是数据本身被加密的事实会使索引变得无用。

编辑:以下是有关我具体案例的更多详情。有一个约10列左右的表,每个BLOB都有。插入此表的每条记录都将使用AES_ENCRYPT()函数进行加密。在我的应用程序的搜索部分,用户将能够键入他们的查询。我接受他们的查询并像SELECT AES_DECRYPT(fname MYSTATICKEY) AS fname FROM some_table一样解密它,以便我可以使用LIKE子句执行搜索。我很好奇的是索引是否会索引加密数据而不是解密返回的实际数据。我猜测,如果索引仅应用于加密的二进制字符串,那么它根本不会有助于提高性能。我错了吗?

1 个答案:

答案 0 :(得分:2)

请注意以下事项:

  • 您无法将类型FULLTEXT的索引添加到BLOB列(http://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html
  • 因此,您需要使用其他类型的索引。对于BLOB,您必须指定前缀长度(http://dev.mysql.com/doc/refman/5.0/en/create-index.html) - 长度取决于存储引擎(例如,对于MyISAM表,长度最多为1000字节,对于InnoDB表,长度为767字节)。因此,除非您存储的值很短,否则您将无法索引所有数据。
  • AES_ENCRYPT()加密字符串并返回二进制字符串。此二进制字符串将是索引的值。

因此,IMO,您的猜测是正确的 - 索引无助于您的搜索效果。

请注意,“为加密列编制索引”是一个相当普遍的问题 - 网上很少有关于它的文章。例如(虽然这是相当陈旧的,对于MS SQL,它确实涵盖了一些想法):http://blogs.msdn.com/b/raulga/archive/2006/03/11/549754.aspx

另请参阅:What's the best way to store and yet still index encrypted customer data?(顶部答案链接到我在上面找到的同一篇文章)