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

Database 如何搜索使用唯一初始化向量加密的字段?,database,entity-framework,encryption,initialization-vector,Database,Entity Framework,Encryption,Initialization Vector,我知道使用唯一的初始化向量加密每条记录是一种很好的做法,但是如何才能在该字段上进行搜索呢 目前我使用单个IV,这意味着我可以重建加密的搜索字符串,例如,电子邮件地址,并在数据库中查询该字段。如果我开始使用唯一的初始化向量,我将无法重建加密的搜索字符串 我的环境是ASP.NET、实体框架和SQL Server。也许直接在数据库上更容易,但我的查询是通过LINQ到实体的 [我的第一个问题-最后我找不到答案!]使用唯一的IV,您必须解密每个记录以匹配加密内容,因为您知道,每次加密同一条记录时,您都会得

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

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

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


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

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

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

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

但是,如果您正在处理具有大量可能输入的内容,此解决方案可能会起作用


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

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

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

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

但是,如果您正在处理具有大量可能输入的内容,此解决方案可能会起作用


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

好的横向思考。因此,哈希解决方案可能对电子邮件地址很有效。但是,出于同样的原因,那篇专栏文章的普通IV不是同样安全吗?我不是这方面的专家,只是从我多年来读到的东西中学到的。但我的理解是,反对静态IV的主要原因是,如果攻击者看到相同的加密消息两次,他们就会知道它是相同的明文(当然,对于散列也是如此)。但我没有看到任何东西说静态IV为攻击者提供了解密其他消息的手段。如果是这样的话,那么我会说你是正确的,静态IV和动态IV+散列没有什么不同。好的横向思维。因此,哈希解决方案可能对电子邮件地址很有效。但是,出于同样的原因,那篇专栏文章的普通IV不是同样安全吗?我不是这方面的专家,只是从我多年来读到的东西中学到的。但我的理解是,反对静态IV的主要原因是,如果攻击者看到相同的加密消息两次,他们就会知道它是相同的明文(当然,对于散列也是如此)。但我没有看到任何东西说静态IV为攻击者提供了解密其他消息的手段。如果是这样的话,那么我会说你是正确的,静态IV和动态IV+散列没有什么不同。