【问题标题】:User lookup on encrypted database fields用户查找加密数据库字段
【发布时间】: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


    【解决方案1】:

    你为什么不使用反向的?

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

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

    【讨论】:

    • blinks ...所以选项 4 :) 我确实错过了一些明显的东西!我喜欢优雅,但我不认为 MySQL(在 MyISAM 上最好忽略的原因)允许您将 AES 加密字符串插入 BLOB 字段以外的任何内容?更正 - 刚刚检查过,它也适用于 TEXT 字段......但同样无法索引(除了 FULLTEXT)
    • 如果您使用的是 MySQL 5.6 或更高版本,只需使用TO_BASE64 将加密的二进制文件转换为字符串。如果没有,请在应用程序级别进行加密和解密或添加 Base64 UDF。见stackoverflow.com/questions/358500/base64-encode-in-mysql
    • 不幸的是,它是 MySQL 5.1(Slackware 的构建非常保守)——据我所知,应用程序级别的 base64 编码可以将 0x0 合并到字符串中——这是 VARCHAR 中的终止符字段 - 再说一次,它只适用于 BLOB 或 TEXT?在你的帖子之后我正在研究它,看看我是否可以让它工作;本质上它是在应用程序中重新创建 AES_ENCRYPT 并将 base64 编码的字符串转换为 VARCHAR ......我对 tbh 不太幸运:\
    • base64 可以将任何二进制编码为字符串。 en.wikipedia.org/wiki/Base64 因此,您可以将其存储到“普通”字符类型列中,也可以为其创建索引。相信我。
    • 谢谢 - 我明天会坚持下去 :)
    【解决方案2】:

    选项 1。

    您的数据可以被索引以进行搜索和比较,但只能针对加密的搜索词。

    【讨论】:

    • 我想我会选择选项 1 - 因为重点是基于电子邮件地址(来自用户输入)和 AFAICT 使用 VARCHAR 上的哈希创建一个安全的可索引字段(或类似)是使用 MySQL 实现此目的的唯一方法。这并不是一个复杂的搜索,只是一个快速标识符,可以放入 WHERESELECT 以检索数据以进行验证或其他任何操作。给我一个电子邮件地址的索引搜索,这样我就可以快速查询并且只需要解密一行而不是整个表:)
    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多