基本上我有一个包含用户数据的表,所有这些都是 AES 加密的(在 BLOB 字段中)。
这意味着这些字段中没有一个可以被索引,这将减慢对该表的任何查询 - 特别是因为整个表需要在进行任何匹配之前解密...
... WHERE AES_DECRYPT(`user`.`email`, '{$sSomeKeyHere}') = '{$sSubmittedEmail}'
所以,我想要的是一个只包含哈希值的字段,未加密,可以索引以用作快速查找。最好的查找可能是电子邮件地址的一些派生词(小写、反转和散列或其他一些可复制的过程),这样您就可以有效地搜索电子邮件地址而不必解密电子邮件地址……但我需要保留它安全。
所以,我正在考虑的选项:
1:在将电子邮件地址插入数据库之前,仅使用小写字母和 SHA-256(或 512)对其进行哈希处理
2:稍微复杂一些;小写加上一些其他可复制的功能,在对电子邮件地址进行哈希处理之前对其进行加扰。
3:从 user.last_login_date
(未加密)创建一个加盐字符串,并使用它来创建带有电子邮件地址的加盐哈希 - 并在每次用户登录时更新查找字段在(因为盐会改变)。然而,这需要一个稍微复杂的 SELECT
语句,仅限于 MySQL 引擎中内置的任何散列函数,因为我需要使用上次登录日期重新创建散列来执行搜索。
所以问题是,只选择选项 1 可以吗?
选项 2 更好吗?
选项 3 是否像我认为的那样完全矫枉过正?
或者我错过了一些非常明显的事情,而实际上有更好的解决方案?
最佳答案
为什么不使用反向的呢?
... WHERE `user`.`email` = AES_ENCRYPT('{$sSubmittedEmail}'`, '{$sSomeKeyHere}')
并且加密后的字符串可以通过base64
或者类似的函数存储成VARCHAR
类型。
关于mysql - 用户在加密数据库字段上查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020238/