关于安全性:如何加密mysql数据库中的电子邮件但仍能查询它们?

how to encrypt emails in mysql database but still be able to query them?

我想使用加密将用户的电子邮件地址存储在MySQL数据库中,以确保在数据库受到破坏时不会公开用户的电子邮件地址。我相信如果我用mysql的AES_ENCRYPT()函数加密它们,我就不能在INNODB表中创建索引,因为我必须使用BLOB数据类型。如果选择的表很大,则需要很长时间。

什么是保护电子邮件地址的最佳解决方案,但仍然能够快速查询它们并将它们作为列中的唯一值保存?


当用户在您的站点上注册时,使用aes_encrypt()加密电子邮件。

1
INSERT into users (email) VALUES (AES_ENCRYPT('[email protected]', 'aeskey'));

查询数据库时,可以这样调用aes_decrypt()函数:

1
SELECT AES_DECRYPT(email, 'aeskey') from users;


如果您使用sha-256或类似的方法散列地址,您仍然可以索引表,还可以进行快速地址查找(当用户搜索example.com时,您只需散列输入并在表中选择匹配的散列)。

ssh使用了一个非常类似的哈希技巧。(有关详细信息,请在该手册页中查找-H选项。)


aes_decrypt(email,'secretkey')和aes_encrypt(email,'secretkey')是最佳解决方案,

我不能百分之百地确定在加密后是否是唯一的,但理论上说如果电子邮件是唯一的,那么加密应该是唯一的。