我想使用加密将用户的电子邮件地址存储在MySQL数据库中,以确保在数据库受到威胁时不会公开它们。我相信如果我使用mysql的AES_ENCRYPT()
函数对它们进行加密,我就无法在INNODB
表中创建索引,因为我必须使用BLOB
数据类型。如果表格变得非常大,则需要很长时间。
保护电子邮件地址的最佳解决方案是什么,但仍能快速查询并将其保留为列中的唯一值?
答案 0 :(得分:10)
当用户在您的网站上注册时,请使用AES_ENCRYPT()来加密电子邮件。
INSERT into users (email) VALUES (AES_ENCRYPT('someemail@example.com', 'aeskey'));
查询数据库时,可以像这样调用AES_DECRYPT()函数:
SELECT AES_DECRYPT(email, 'aeskey') from users;
答案 1 :(得分:4)
如果使用SHA-256或类似方法对地址进行哈希处理,您仍然可以索引表,您仍然可以进行快速地址查找(当用户搜索example@example.com时,您只需对输入进行哈希处理,选择表中的匹配哈希值。
ssh使用very similar散列技巧。 (有关详细信息,请在该联机帮助页中查找-H
选项。)
答案 2 :(得分:0)
AES_DECRYPT(电子邮件,'secretkey')和AES_ENCRYPT(电子邮件,'secretkey')是最佳解决方案,
我不是百分之百确定加密后的独特之处,但理论上说,如果电子邮件是唯一的标识应该是唯一的