我有一个使用mysql的rails 3应用程序。该应用程序将客户的电话号码和电子邮件存储在表格中。我想加密字段而不是将它们存储为普通和直接值。这样,即使他/她可以访问数据库,该表对任何人都无用。
但还有另一个问题。使用电子邮件和电话号码查询记录很多,并编制索引。如何在不影响性能的情况下实现对字段的加密,并且仍然可以轻松搜索和匹配?
答案 0 :(得分:5)
首先,请记住,如果有人获得了足够的访问权来读取您的代码文件,他可能会获得您的解密例程和密钥 - 您的加密只能保护您免受攻击者的攻击而无法访问数据库。
如果你想使用MySQL搜索部分邮件地址和电话号码,你就不能使用加密 - 如果数据以MySQL无法读取的方式加密,那么,MySQL无法读取,因此可以不要搜索它。
但是,您可以执行以下操作:
如果要查找带有电子邮件X的行,请选择email_hash = hash(X)的位置。如果您想知道某行的电子邮件地址,请选择email_crypt并解密。
然而,这将允许攻击者测试某个电子邮件是否在您的数据库中(即他们可以强制散列)。为了防止这种情况,您应该使用HMAC方法进行散列并保持密钥的安全。
您现在可以想到“嘿,我可以通过加密普通电子邮件地址并查找包含相同加密字符串的行来跳过哈希并进行查找”。不,你做不到。如果您对数据进行加密,则使用与数据一起存储的随机“IV”,以确保如果两次加密相同的数据,则会得到不同的结果。您可以将IV设置为常量值,但这是使用加密技术的非标准方式,可能会导致安全问题,因此请勿这样做。另外,使用适当的链接模式,例如AES-CBC。
答案 1 :(得分:1)
答案 2 :(得分:1)
在MySQL中更容易做到。您可以使用简单的MySQL的ENCODE/DECODE函数
或高级功能,如AES_DECRYPT()
或AES_ENCRYPT()
。
查看所有功能列表是here。
注意:无论您使用什么,请确保将盐存储在此行的列中。并在应用程序配置文件中存储另一个salt。这将使用动态盐进行加密,您也可以保留部分盐的秘密。攻击者很难找回它们。