gpt4 book ai didi

sql-server - 在sql server中对加密列建立索引

转载 作者:行者123 更新时间:2023-12-03 02:18:37 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

Create an index on this computed column 。要搜索名称,请不要仅执行 WHERE crypto_last_name = encrypt(last_name),而是添加对哈希的搜索:WHERE crypto_last_name = encrypt(last_name) AND CHECKSUM(encrypt(last_name)) = hashed_encrypted_last_name。这要快得多,因为 SQL Server 只需在索引中搜索一个小整数值,然后验证名称是否确实匹配,从而大大减少了要检查的数据量。请注意,无论有或没有 CHECKSUM,此方案中都不会解密任何数据 - 我们仅搜索加密值。加速并不是来自于减少加密/解密的数据量(仅加密您传入的数据),而是来自需要索引和比较平等的数据量。

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

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

关于sql-server - 在sql server中对加密列建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26344011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com