【发布时间】:2012-02-19 16:07:02
【问题描述】:
基本上我有一个保存用户数据的表,所有这些都是 AES 加密的(在 BLOB 字段中)。
这意味着这些字段都不能被索引,这会减慢对该表的任何查询 - 特别是因为在进行任何匹配之前需要解密整个表...
... WHERE AES_DECRYPT(`user`.`email`, '{$sSomeKeyHere}') = '{$sSubmittedEmail}'
所以,我想要的是一个只包含一个未加密的哈希值的字段,它可以被索引以用作快速查找。最好的查找可能是电子邮件地址的一些派生词(小写、反转和散列或其他一些可复制的过程),这样您就可以有效地搜索电子邮件地址而无需解密电子邮件地址......但我需要保留它安全。
所以,我正在考虑的选项:
1:在将电子邮件地址插入数据库之前,只需小写并使用 SHA-256(或 512)对电子邮件地址进行哈希处理
2:稍微复杂一些;小写加上一些其他可复制的功能,在散列之前对电子邮件地址进行加扰。
3:从user.last_login_date(未加密)创建一个盐字符串,并使用它创建一个带有电子邮件地址的盐渍哈希 - 并在每次用户登录时更新查找字段(因为盐将有改变)。然而,这需要一个稍微复杂的 SELECT 语句,仅限于 MySQL 引擎中内置的任何散列函数,因为我需要使用上次登录日期重新创建散列来执行搜索。
所以问题是,只选择选项 1 可以吗?
选项 2 更好吗?
选项 3 是否像我认为的那样完全矫枉过正?
或者我是否遗漏了一些非常明显的东西,实际上有更好的解决方案?
【问题讨论】:
标签: mysql performance database-design hash