繁体   English   中英

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

[英]Secure method for supporting partial string matching on an encrypted database field

我正在编写一个使用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不是必须的,任何加密/解密方法都可以,只要它足够安全即可。

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

这是加密数据库的困难。 您必须在以下两者之一中进行选择:

  1. 实验性的学术设计,例如订单显示加密,缺乏我们在加密数据时通常期望的语义安全性。
  2. 通过盲索引和Bloom过滤器进行认证的加密。

如果您愿意使用后一种方法(我愿意),则该过程有些简单:

  1. 为您希望支持的每个部分匹配生成一个单独的密钥。
  2. 创建一个将明文确定性地转换为哈希前消息的函数(例如,街道名称和道路名称的第一个字母( 123 Main Street => 123m等)
  3. 在步骤2的输出上使用安全的密钥哈希结构,例如hash_hmac()hash_pbkdf2()
  4. (可选):将第3步的输出截断为少量字节(例如8个十六进制字符)。 这意味着您的搜索结果中出现更多的误报,但是与可以访问您的数据库服务器的对手相比,可以从您的明文中学到的事实却很少那么独特。
  5. 将其与密文一起存储,密文本身应进行安全加密

当然,如果您的加密密钥与数据库服务器存储在同一硬件上,那么所有这些都是徒劳的。 能够访问数据库(例如SQL注入)的攻击者可以逃逸到文件系统并窃取密钥,除非Web服务器和数据库位于单独的硬件上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM