1

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

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

我的环境是 ASP.NET、Entity Framework 和 SQL Server。也许这直接在数据库上更容易,但我的查询是通过 LINQ-to-Entities 进行的。

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

4

1 回答 1

1

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

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

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

但是,如果您正在使用具有大量可能输入的东西,则此解决方案可能会起作用。

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

于 2013-04-19T16:48:00.463 回答