如何搜索使用唯一初始化向量加密的字段?

时间:2013-04-19 16:00:31

标签: database entity-framework encryption initialization-vector

我理解使用唯一的初始化向量来加密每条记录是一种好习惯,但是如何在该字段上进行搜索呢?

目前我使用单个IV,这意味着我可以重建加密的搜索字符串,例如,电子邮件地址并查询数据库中的该字段。如果我开始使用唯一的初始化向量,我将无法重建加密的搜索字符串。

我的环境是ASP.NET,实体框架和SQL Server。也许这直接在数据库上更容易,但我的查询是通过LINQ-to-Entities。

[我的第一个问题 - 最后我找不到答案!]

1 个答案:

答案 0 :(得分:1)

使用唯一的IV,您必须解密每条记录才能匹配加密内容,因为您知道每次加密相同的值时都会获得不同的值。

假设这是不可接受的(在一个小小的表上会很好,但对于具有相当数量记录的任何内容都没有),一种替代方法是将值散列并在数据库中存储散列,在单独的列中。您可以通过哈希进行搜索,并且只对匹配的记录进行解密,以确认它确实匹配。

您正在加密的哈希问题是,大多数值得加密的事情(信用卡,帐号等)只有固定数量的可能输入。即使哈希附加了一个独特的盐,例如,哈希在信用卡上也很糟糕,因为只有十亿或万亿或任何可能的卡号,所以如果你有盐,哈希和一个像样的处理器,你可以在相当短的时间内对卡号进行逆向工程。

如果您正在处理具有大量可能输入的内容,则此解决方案可能会有效。

另一种选择是,如果加密数据的一部分是合理的唯一的,但不一定是秘密的(例如信用卡号码的最后4个),您可以将该部分存储在明文中,并使用它将大型数据集过滤成非常小的结果集,然后解密该结果集中的每个记录,以将其与搜索条件进行比较。