基本上我有一个包含用户数据的表,所有这些数据都是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是否像我认为的那样完全矫枉过正?
或者我错过了一些非常明显的东西,实际上有更好的解决方案吗?
答案 0 :(得分:2)
为什么不使用反转的?
... WHERE `user`.`email` = AES_ENCRYPT('{$sSubmittedEmail}'`, '{$sSomeKeyHere}')
加密字符串可以通过VARCHAR
或类似功能存储到base64
类型中。
答案 1 :(得分:0)
选项1。
您的数据可以编入索引以进行搜索和比较,但仅限于加密搜索字词。