如何加密mysql数据库中的电子邮件,但仍然能够查询它们?

问题描述:

我要使用加密,以确保它们不会被公之于众,如果数据库被泄露的用户的电子邮件地址存储在MySQL数据库中。我相信,如果我与MySQL的AES_ENCRYPT()功能进行加密,因为我必须使用BLOB数据类型,我不能创建在INNODB表中的索引。如果表格变得非常大,则需要很长时间。如何加密mysql数据库中的电子邮件,但仍然能够查询它们?

什么是保证电子邮件地址,但仍然能够对它们进行查询速度快,在列保存它们独特价值的最佳解决方案?

当您网站上的用户注册,使用AES_ENCRYPT(),以电子邮件进行加密。

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

当你查询你的数据库,你可以这样调用的AES_DECRYPT()函数:

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

如果用哈希SHA-256或类似的东西的地址,你仍然可以索引你的表,你仍然可以做快速地址查找(当[email protected]用户搜索,你只哈希输入并在表中选择匹配哈希)。

ssh使用very similar散列伎俩。 (寻找在联机帮助页的详细信息,-H选项。)

+0

我想,如果我这样做的方法我不能未加密的电子邮件地址,并使用他们稍后会在需要时给用户发邮件 – bshack 2011-01-30 02:32:13

+0

@bshack,任何可能允许您从电子数据库中检索电子邮件地址的技术都可以被获取数据库内容的攻击者使用。像@pcmantinker所建议的那样,您在这一点上唯一真正的保护就是在您的应用程序中硬编码的关键字,但经常获得数据库转储的人也可以获得程序二进制文件。 (并不总是,但是依赖嵌入代码的密钥很脆弱:) – sarnold 2011-01-30 02:36:07

+1

您可以散列电子邮件地址以进行快速搜索,并在不同的列或表中拥有加密值。我会把它放到一个单独的表中,所以如果需要的话,你可以把它放在不同的分区上。 – 2011-01-30 02:48:53

AES_DECRYPT(电子邮件, '秘密密钥')和AES_ENCRYPT(电子邮件, '秘密密钥')是最佳解决方案,

我不是100%地肯定加密,但理论后beeing唯一说,如果邮件是独一无二的encription应该是唯一的