how to encrypt emails in mysql database but still be able to query them?
我想使用加密将用户的电子邮件地址存储在MySQL数据库中,以确保在数据库受到破坏时不会公开用户的电子邮件地址。我相信如果我用mysql的AES_ENCRYPT()函数加密它们,我就不能在INNODB表中创建索引,因为我必须使用BLOB数据类型。如果选择的表很大,则需要很长时间。
什么是保护电子邮件地址的最佳解决方案,但仍然能够快速查询它们并将它们作为列中的唯一值保存?
当用户在您的站点上注册时,使用aes_encrypt()加密电子邮件。
查询数据库时,可以这样调用aes_decrypt()函数:
号
- 所以基本上我不能创建一个唯一的索引电子邮件地址列,如果我想使用加密?
- 我相信您不应该有冲突的AES加密值,除非另一个用户在注册时试图使用相同的电子邮件。当用户注册时,您可以通过查询数据库来检查电子邮件是否唯一。关于aes加密和mysql的有用链接:thinkdiff.net/mysql/encrypt-mysql-data-using-aes-technologies
- 我将尝试使用文本列类型,我将强制使用端到端的UTF-8,这样就可以了。如果整个服务器受到威胁,而不仅仅是数据库,那么黑客可以获取加密密钥并解密数据库中的电子邮件地址。
- @bshack,是的,如果密钥和消息都被截获,那么游戏就结束了,但是为了另一层安全性,您可以在不同的盒子上安装DB服务器和应用服务器。
- 然后你必须将密钥存储在你的服务器上,如果你的系统和应用被黑客入侵,不管怎样,这将对黑客开放。
- @JM4,不一定。如果您有一个分离应用程序和数据库的服务器体系结构,这将是一种更安全的方法。事实上,只要有足够的资源和时间,任何东西都可以被破解。
如果您使用sha-256或类似的方法散列地址,您仍然可以索引表,还可以进行快速地址查找(当用户搜索example.com时,您只需散列输入并在表中选择匹配的散列)。
ssh使用了一个非常类似的哈希技巧。(有关详细信息,请在该手册页中查找-H选项。)
- 我想如果我使用这种方法,我就不能取消对电子邮件地址的加密,并在以后需要时使用它们向用户发送电子邮件。
- @bshack,您可能使用的任何允许您从数据库中检索电子邮件地址的技术也可能被获取数据库内容的攻击者使用。正如@pcmantinker所建议的,此时唯一真正的保护就是在应用程序中硬编码一个密钥,但是经常得到数据库转储的人也可以得到程序二进制文件。(不总是这样,但是依赖嵌入在代码中的密钥是非常脆弱的。:)
- 您可以散列电子邮件地址以便快速搜索,并且在不同的列或表中具有加密值。我将把它放在一个单独的表中,这样您可以在需要时将它放在不同的分区上。
- 如@sarnold所建议的,如果您不需要对数据库中的电子邮件进行显式访问,那么散列将是一个很好的解决方案。我使用的软件对密码进行哈希处理,并将用户输入的哈希值与数据库中的哈希值进行比较。不过,这取决于你检索电子邮件的目的。
aes_decrypt(email,'secretkey')和aes_encrypt(email,'secretkey')是最佳解决方案,
我不能百分之百地确定在加密后是否是唯一的,但理论上说如果电子邮件是唯一的,那么加密应该是唯一的。
- AES加密数据是否可以存储在列类型中,该列类型上可以有innodb列索引?