【问题标题】:how to encrypt emails in mysql database but still be able to query them?如何加密 mysql 数据库中的电子邮件但仍然能够查询它们?
【发布时间】:2011-06-17 23:08:25
【问题描述】:

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

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

【问题讨论】:

    标签: mysql security encryption


    【解决方案1】:

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

    INSERT into users (email) VALUES (AES_ENCRYPT('someemail@example.com', 'aeskey'));
    

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

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

    【讨论】:

    • 所以如果我想使用加密,基本上我无法为电子邮件地址列创建唯一索引?
    • 我相信您不应该有冲突的 AES 加密值,除非其他用户在注册时尝试使用相同的电子邮件。您可以在用户注册时通过查询数据库来检查电子邮件是否唯一。关于 AES 加密和 MySQL 的有用链接:thinkdiff.net/mysql/encrypt-mysql-data-using-aes-techniques
    • 我会尝试使用文本列类型,我强制执行端到端 utf-8,所以应该没问题。如果整个服务器被入侵而不仅仅是数据库,那么黑客可以获取加密密钥并解密数据库中的电子邮件地址。
    • @bshack,是的,如果密钥和消息都被拦截,那么游戏就结束了,但是您可以将数据库服务器和应用程序服务器放在不同的盒子上,以获得另一层安全。
    • 然后你必须将密钥存储在你的服务器上,如果你的系统和应用程序被黑客入侵,无论如何都会对黑客开放。
    【解决方案2】:

    如果您使用 SHA-256 或类似方法对地址进行哈希处理,您仍然可以索引您的表,您仍然可以进行快速地址查找(当用户搜索 example@example.com 时,您只需对输入进行哈希处理,然后选择表中匹配的哈希值)。

    ssh 使用very similar 散列技巧。 (在该手册页中查找 -H 选项以了解详细信息。)

    【讨论】:

    • 我认为如果我使用这种方法,我将无法取消加密电子邮件地址,并在以后根据需要使用它们向用户发送电子邮件。
    • @bshack,您可能使用的任何可以让您从数据库中检索电子邮件地址的技术也可能被获取数据库内容的攻击者使用。正如@pcmantinker 所建议的那样,此时您唯一真正的保护将是在您的应用程序中硬编码的密钥,但是经常获取数据库转储的人也可以获得程序二进制文件。 (并非总是如此,但依赖嵌入在代码中的密钥非常脆弱。:)
    • 您可以散列电子邮件地址以进行快速搜索,并在不同的列或表中具有加密值。我会把它放在一个单独的表中,所以如果需要,你可以把它放在不同的分区上。
    • 哈希,正如@sarnold 所建议的,如果您不需要显式访问数据库中的电子邮件,这将是一个很好的解决方案。我使用了对密码进行哈希处理并将用户输入的哈希值与数据库中的哈希值进行比较的软件。不过,这实际上取决于您检索电子邮件的目的。
    • 您还可以对加密的电子邮件进行哈希处理,而不是哈希(普通)电子邮件...
    【解决方案3】:

    AES_DECRYPT(email, 'secretkey') 和 AES_ENCRYPT(email, 'secretkey') 是最优解,

    我不是 100% 确定加密后的蜜蜂是唯一的,但理论上说如果电子邮件是唯一的,加密应该是唯一的

    【讨论】:

    • 能否将 AES 加密数据存储在可以具有 innodb 列索引的列类型中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多