用于支持加密数据库字段上的部分字符串匹配的安全方法

时间:2014-03-19 05:54:38

标签: php mysql security encryption

我正在编写一个使用PHP + MySQL的Web应用程序。我知道PHP和MySQL都可以执行数据加密。我还读到,在安全性方面,加密PHP级别的数据是更受欢迎的。但现在我面临这个问题:我想加密一些用户数据的地址字段。但是在使用PHP编写的网页中,我想支持地址字段的部分字符串匹配。我目前的解决方案是加密MySQL级别的数据,然后进行如下搜索:

// PHP code for inserting data into database
mysql_query("INSERT INTO test VALUES ('', AES_ENCRYPT('" . $addr . "', UNHEX('" . $hexstring . "')))", $link);

// PHP code for partial string matching
mysql_query("SELECT * FROM test WHERE AES_DECRYPT(address, UNHEX('" . $hexstring . "')) like '%Street%'", $link);

是否有更安全的方式在PHP级别而不是MySQL级别执行加密?我能想到的是检索所有记录,用PHP解密数据并执行匹配,但这将非常慢。 AES不是必须的,任何加密/解密方法都可以,只要它足够安全。

1 个答案:

答案 0 :(得分:0)

  

我想加密一些用户数据的地址字段。但是在使用PHP编写的网页中,我想支持地址字段的部分字符串匹配。

这是加密数据库的难点。你必须在两者之一中选择:

  1. 实验性学术设计,例如订单显示加密,缺乏加密数据时通常所期望的语义安全性。
  2. 使用blind indexes and bloom filters进行身份验证加密。
  3. 如果您不喜欢后一种方法(我这样做),那么这个过程有点简单:

    1. 为您希望支持的每个部分匹配生成单独的密钥。
    2. 创建一个确定性地将明文转换为预哈希消息的函数(例如道路名称和道路名称的第一个字母(123 Main Street =&gt; 123m等)<) / LI>
    3. 在步骤2的输出中使用安全密钥哈希构造,例如hash_hmac()hash_pbkdf2()
    4. (可选):将步骤3的输出截断为少量字节(例如8个十六进制字符)。这意味着您的搜索结果中会出现更多误报,但可以从已获得数据库服务器访问权限的攻击者那里获得有关明文的唯一区别事实。
    5. 与密文一起存储,密文本身应为encrypted securely
    6. 当然,如果您的加密密钥存储在与数据库服务器相同的硬件上,则所有这些都是徒劳的。能够访问您的数据库的攻击者(例如SQL注入)可以转义到文件系统并窃取密钥,除非Web服务器和数据库位于不同的硬件上。