部分搜索加密字段

时间:2012-09-04 07:33:03

标签: sql-server database search encryption

最近我遇到了一个问题,加密数据库字段,如SSN,但仍然需要对其进行“部分搜索”。

例如:SSN 123-45-6789在数据库中加密为abcdxyz。当用户在搜索框中输入“2345”时,它必须出现在结果中。

我们在数据库中有数百万条记录。我们正在使用SQL Server 2008 R2。我一直在谷歌搜索,但仍然没有看到任何好的解决方案。对此有什么好的解决方案吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:9)

不,没有。如果可以搜索加密字段,那么根据定义它将被严重加密。可能的替代方案是:

  1. 搜索解密的值。这在实践中是无法忍受的,因为每个查询都需要解密数百万个值。
  2. 仅搜索完全匹配。由于加密值是盐化的,因此只有在加密数据与加密数据一起存储并且对散列值进行搜索时才能进行精确匹配搜索。
  3. 使用Transparent Data Encryption代替列加密。
  4. 选项3)是迄今为止最好的,但需要企业版许可。如果TDE不可用,则必须删除部分搜索的要求,没有现实的方法来满足它。

答案 1 :(得分:4)

SSN的可能值少于10亿,而且分布不均匀。如果有人要获取您的数据库的副本,对任何特定记录的暴力攻击将是直截了当的。事实上,如果这个人的出生日期和状态在记录中是明确的并且它们是在2011年之前出生的,那么自定义算法可以极大地减少可能的SSN数量,使得暴力攻击变得更加容易。

正如您所注意到的,一旦您加密数据,您无法在不先解密每条记录的情况下搜索其明文 - 这是一项不合理的昂贵操作。

我赞赏保护人们隐私的愿望,但你应该使用TDE,BitLocker或EFS,而不是加密像这样的个别字段。