用户在加密数据库字段上查找

时间:2012-01-26 15:10:20

标签: mysql performance database-design hash

基本上我有一个包含用户数据的表,所有这些数据都是AES加密的(在BLOB字段中)。

这意味着这些字段都不能被索引,这会减慢该表上的任何查询 - 特别是因为整个表在进行任何匹配之前都需要解密...

... WHERE AES_DECRYPT(`user`.`email`, '{$sSomeKeyHere}') = '{$sSubmittedEmail}'

所以,我想要的是一个只包含未加密的哈希值的字段,可以将其编入索引以用作快速查找。最好的查找可能是电子邮件地址的一些衍生物(小写,反转和散列或其他一些可复制的过程),这样您就可以有效地搜索电子邮件地址而无需解密电子邮件地址......但我需要保留安全

所以,我正在考虑的选项:

1:在将电子邮件地址插入数据库之前,只需使用小写和SHA-256(或512)哈希电子邮件地址

2:稍微复杂一点;小写加上一些其他可复制的函数,在对其进行散列之前对其进行加扰。

3:从user.last_login_date创建一个salt字符串(未加密)并使用该字符串创建一个带有电子邮件地址的盐渍哈希 - 并在每次用户登录时更新查找字段(因为盐会改变的。)然而,这需要稍微复杂的SELECT语句,仅限于MySQL引擎中内置的任何散列函数,因为我需要使用上次登录日期重新创建散列来执行搜索。


所以问题是,选择1可以吗?

选项2更好吗?

选项3是否像我认为的那样完全矫枉过正?

或者我错过了一些非常明显的东西,实际上有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

为什么不使用反转的?

... WHERE `user`.`email` = AES_ENCRYPT('{$sSubmittedEmail}'`, '{$sSomeKeyHere}')

加密字符串可以通过VARCHAR或类似功能存储到base64类型中。

答案 1 :(得分:0)

选项1。

您的数据可以编入索引以进行搜索和比较,但仅限于加密搜索字词。