有没有一种快速的方法来查找 SQL Server 2008 R2 中所有已加密/具有加密数据的列?
我需要取消开发服务器中所有加密列中的数据(根据我们的业务规则)。我知道大部分列,因为我们经常使用它们,但我想彻底,而且我想能够证明我已经找到了它们。
我搜索了网络,查看了INFORMATION_SCHEMA并检查了我认为有用的 DMV 以及sys.columns和sys.objects——但到目前为止还没有运气。
有没有一种快速的方法来查找 SQL Server 2008 R2 中所有已加密/具有加密数据的列?
我需要取消开发服务器中所有加密列中的数据(根据我们的业务规则)。我知道大部分列,因为我们经常使用它们,但我想彻底,而且我想能够证明我已经找到了它们。
我搜索了网络,查看了INFORMATION_SCHEMA并检查了我认为有用的 DMV 以及sys.columns和sys.objects——但到目前为止还没有运气。
假设您正在讨论使用 SQL Server 密钥加密的数据,则可以找到这些列。
该
Key_name()
函数将返回用于加密该特定值的密钥的名称,如果没有使用“已知”密钥(第 3 方,或简单未加密)加密任何内容,则返回 NULL。有了这个知识,我们可以测试每一列,看看它是否至少包含一个行,该行的 varbinary 值返回一个键名
key_name() 的功能
结果:
结果:
如何实现它来查找加密列
结果:
单元级加密的问题在于列本身并没有真正加密,而是该列中包含的数据。列本身只是 varbinary 列(因为这是必需的)并且可以包含完全清晰的数据。真正使数据加密的是使用
ENCRYPTBY*
和函数。DECRYPTBY*
您可以从简单地在 sys.columns 视图中查询所有 varbinary 列开始:
否则,您需要检查您的代码以确定加密/解密函数的使用位置:
在特定数据库上运行以下查询
略有改动
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ca9d8360-5d7e-4de1-abe6-ce1afda595a9/how-to-find-which-table-columns-are-encrypted?forum=sqlsecurity
您可以通过搜索所有 varbinary 列并使用 KEY_NAME 函数检查加密密钥来找到使用 keys\certificates 加密的列。
然而,这个过程有点昂贵和耗时。如果您需要定期查找这些列,我建议使用扩展属性“标记”这些列。我们可以在 Edward Dortland 的解决方案的基础上构建,并使用扩展属性(如 encrypted、encryptkey 和 encryptcert)“标记”找到的列。
然后我们可以通过搜索扩展属性轻松找到加密列。