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

标签 mysql performance database-design hash

基本上我有一个包含用户数据的表,所有这些都是 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/

相关文章:

mysql - 删除所有超过 15 分钟的条目

python - 无需替换数组的快速组合 - NumPy/Python

ruby - 如何设计数据库来存储和检索 ruby​​ 中的大型项目/技能列表

mysql - 在数据库表中为 "log of changes"创建表的最佳做法是什么?

mysql - SSIS:导出和导入带有特殊字符的CSV文件

mysql - 为什么 MySQL 查询中的三行顺序不正确?

mysql - 如何从一个表中选择最后一行然后更新另一个表的最后一行?

php - MYSQL 连接三张表

string - String.substring() 的性能与手动查找复制的 char[] 数组相比如何?

php - 用户-项目关系的数据库设计