如何检查一个包含加密电子邮件地址的表中是否存在电子邮件地址

3
我有一个包含用户加密电子邮件地址的表格。当新用户注册时,我希望检查输入的电子邮件地址是否已经存在于该表格中。我使用php中的openssl_encrypt函数对每个电子邮件地址进行加密。由于该函数即使传递相同的字符串参数也会返回不同的加密值,因此我不能检查电子邮件地址是否已经存在于该表格中。那么,有什么可行但安全的方法可以加密和检查电子邮件地址是否存在于该表格中呢?

2
这个涉及到使用 hash答案可能会有帮助? - camelCase
有一件非常重要的事情需要记住,那就是在加密电子邮件地址并将其存储在数据库中之前,请确保将其转换为小写字母(并将电子邮件地址转换为小写字母进行比较);因为我曾经吃过亏,发现人们在电子邮件中使用大小写非常不一致! - CD001
嘿 - 看起来我几乎在4年前问了同样的问题:https://dev59.com/21_Va4cB1Zd3GeqPWLhx - CD001
哈希似乎是正确的选择。使用PHP内置的hash函数和SHA-256算法是否是一个好主意,还是有更好的哈希方式? - sha28k
你可以在数据库中使用BLOB数据并使用MySQL内置的AES_ENCRYPT()函数存储电子邮件。然后,当您需要查找电子邮件地址时,可以执行WHERE AES_ENCRYPT(:email,:key) = user.email ...其中:email是来自您的表单的电子邮件地址,:key是您正在使用的加密密钥(可以是任何内容,如果您喜欢可以在config.php文件中设置,只要它在您的文档根目录之外即可)。 - CD001
1个回答

1

在我们有关PHP安全数据加密的论文中,这里回答了加密信息索引的问题:

许多公司遇到的一个不常见的问题是:“我们如何在数据库中加密信息并仍然对其进行索引以实现快速检索?”例如,在医疗保健应用程序中,如果您需要能够通过社会安全号码检索患者记录。如果您有数百万条记录,逐个解密每个记录以执行简单的记录查找将对应用程序和数据库服务器都很昂贵。存储这样敏感的记录是不可行的(除非您喜欢向客户道歉并提供一年免费的身份盗窃保护)。相反,为索引目的创建此信息的盲目索引。首先,加密信息并将其存储在一个字段中(例如:ssn)。然后,在另一个字段(例如:ssn_lookup)中使用单独的密钥存储纯文本的单独HMAC,并在第二个字段上创建数据库索引。(这个想法是在 Raul Garcia的MSDN博客文章中提出的。如果您正在开发.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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接