Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为sql server中的加密列编制索引_Sql Server - Fatal编程技术网

Sql server 为sql server中的加密列编制索引

Sql server 为sql server中的加密列编制索引,sql-server,Sql Server,我将患者健康信息存储在SQL Server 2012数据库中。当我搜索患者姓名时,他们的姓名是加密的,因此搜索速度非常慢。如何在加密列上添加索引 我在varbinary字段上使用对称密钥加密(256位AES) 患者的名字、姓氏、地址、电话号码、DOB、SSN有单独的加密字段。除了SSN之外,所有这些都是可搜索的(也可以是部分的)。作为一种编程解决方案,如果您不需要部分匹配,您可以将哈希存储在另一个字段上的“清除”,并在客户端/应用服务器上使用相同的哈希算法,并在哈希上进行匹配。这有可能是误报匹配

我将患者健康信息存储在SQL Server 2012数据库中。当我搜索患者姓名时,他们的姓名是加密的,因此搜索速度非常慢。如何在加密列上添加索引

我在varbinary字段上使用对称密钥加密(256位AES)


患者的名字、姓氏、地址、电话号码、DOB、SSN有单独的加密字段。除了SSN之外,所有这些都是可搜索的(也可以是部分的)。

作为一种编程解决方案,如果您不需要部分匹配,您可以将哈希存储在另一个字段上的“清除”,并在客户端/应用服务器上使用相同的哈希算法,并在哈希上进行匹配。这有可能是误报匹配,但不需要解密数据。

以@PhillipH提供的答案为基础:如果要对(比如)姓氏执行精确搜索,可以包含定义为
校验和(加密(姓氏))的计算列。
(使用
encrypt
加密操作)。这是安全的,因为它不会泄露任何信息——加密值上的校验和不会泄露任何有关明文的信息

。要在名称上搜索,请在哈希上添加搜索,而不是只执行
WHERE encrypted_last_name=encrypt(last_name)
:在
WHERE encrypted_last_name=encrypt(last_name)和CHECKSUM(encrypt(last_name))=hashed_encrypted_last_name
。这要快得多,因为SQL Server只需搜索索引中的一个小整型值,然后验证名称是否匹配,从而大大减少了要检查的数据量。请注意,在这个方案中,无论是否使用
校验和
,都不会解密任何数据——我们搜索加密的val仅限ue。加速并不是因为减少了加密/解密的数据量(只有您传入的数据是加密的),而是因为减少了需要索引和比较以获得相等性的数据量

唯一的缺点是,这不允许部分搜索,甚至不允许大小写变化,事实上,安全地执行这一操作并不简单。大小写相对简单(哈希
加密(TOUPPER(name))
,确保使用不同的密钥以避免关联),但部分匹配需要专门的索引。我能想到的最简单的方法是使用单独的服务(如索引),但使其使用文件的安全存储(即Windows中的加密文件系统(EFS))当然,这确实意味着需要一个单独的系统进行认证——但我想不出任何方便的解决方案完全保留在SQL Server中,并且不需要额外的代码


如果您仍然可以更改数据库设计/存储,您可能希望考虑透明数据加密(TDE),它具有在引擎级别上在SQL Server中透明、集成的巨大优势。不仅部分匹配更快,因为单独的行不需要解密(整页)。,如果不够快,您可以创建一个全文索引,该索引也将被加密。不过,我不知道TDE是否符合您的安全要求。

如果您使用的是Microsoft SQL server隐式encryptbykey函数,则在该列上使用索引没有任何好处,因为SQL server encryptbykey函数将具有不同的输出由于sql server本身使用的random iv,每次输入都是相同的。

此数据必须符合HIPAA,因此我不认为这是一个允许的解决方案。谢谢。为什么这会违反HIPA?如果在源位置对搜索模式进行散列并使用不可逆散列,则不会处理任何患者身份信息它们的名称在数据库中以纯文本形式显示。我猜哈希的要点是它们绝对是不可逆的。但是,可能还有其他原因导致这不是一个很好的匹配(部分匹配就是其中之一)。祝您解决方案好运:-)感谢您的输入。绝对值得思考!我会让你知道它是如何进行的。不幸的是,这不起作用,因为sql server中的对称密钥加密是不确定的。我有完全相同的问题。不幸的是@Jeroen Mostert的解决方案不起作用,因为sql server中的对称密钥加密(列加密)是不确定的。因此,校验和总是从加密数据中获取不同的值。我想知道你是否找到了解决这个问题的合适办法。