【问题标题】:How to check if an email address exists in a table, which contains encrypted email addresses如何检查包含加密电子邮件地址的表中是否存在电子邮件地址
【发布时间】:2016-02-21 21:19:39
【问题描述】:

我有一张表,其中包含用户的加密电子邮件地址。当新用户注册时,我想检查输入的电子邮件地址是否已存在于表中。我使用 php 中的 openssl_encrypt 函数来加密每个电子邮件地址。由于即使将相同的字符串作为参数传递,该函数也会返回不同的加密值,因此我无法检查电子邮件地址是否已存在于表中。什么是加密检查电子邮件地址是否存在于表中的可行但安全的方法?

【问题讨论】:

  • 这个answer 涉及到hash 的使用可能有帮助吗?
  • ^ 一件非常重要的事情要记住...确保确保在加密它们并将它们存储在数据库中之前将电子邮件地址小写(并将电子邮件小写用于比较);人们真的与电子邮件中的大小写不一致,因为我发现很难!
  • 嘿 - 差不多 4 年前我几乎问过同样的问题:stackoverflow.com/questions/9020238/…
  • 散列似乎是要走的路。使用 SHA-256 算法和 php 内置的 hash 函数是个好主意还是有更好的哈希方法?
  • 您可以使用数据库中的BLOB 数据并使用MySQL 内置的AES_ENCRYPT() 函数存储电子邮件。然后,当您需要查找电子邮件地址时,您可以执行 WHERE AES_ENCRYPT(:email, :key) = user.email ... 其中 :email 是表单中的电子邮件地址,:key 是您正在使用的加密密钥(可以是任何东西,设置在config.php 文件,如果你喜欢,只要它在你的文档根目录之外)。

标签: php mysql encryption


【解决方案1】:

在这里回答:Indexing Encrypted Information 在我们关于 PHP 中安全数据加密的论文中:

许多公司遇到的一个不常见的问题是,“我们如何加密数据库中的信息并仍然对其进行索引以便快速检索?”例如,如果您需要能够在医疗保健应用程序中按社会保险号检索患者记录。

如果您有数百万条记录,那么逐个解密每条记录以执行简单的记录查找对于应用程序和数据库服务器来说都是昂贵的。而且存储如此敏感的记录是行不通的(除非您喜欢向客户道歉并为他们提供一年的免费身份盗用保护)。

相反,为索引目的创建此信息的盲索引。首先,加密信息并将其存储在一个字段中(例如:ssn)。然后,在另一个字段(例如ssn_lookup)中存储带有单独密钥的明文的单独 HMAC,并在第二个字段上创建数据库索引。 (这个想法是在MSDN blog post by Raul Garcia 中提出的。如果您正在开发一个 .NET / SQL Server 解决方案来解决这个问题,Raul 的博客文章可能更相关。)

用于 HMAC 索引目的的密钥应该只对需要查询数据库的应用程序服务器可用,该应用程序服务器应该在单独的硬件上,并且从不检查版本控制。

请注意,这只允许精确搜索,而不是部分搜索。

public function getAccountByEmail($email)
{
    $search = $this->pdo->prepare("SELECT * FROM table WHERE email_lookup = ?")
        ->execute([
            hash_hmac('sha256', $email, $this->searchKeys['email'])
        ])
        ->fetchAll(\PDO::FETCH_ASSOC);
    return $search;
}

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 2016-08-20
    • 2012-09-09
    • 2013-05-01
    • 2017-07-23
    • 1970-01-01
    • 2011-08-17
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多