【发布时间】:2014-01-19 04:59:55
【问题描述】:
我是数据库加密的新手。我们需要对显示敏感信息的各种表中的某些列进行加密。我们遇到的问题是,任何有权访问数据库或其证书和对称密钥(甚至 dbas)的人都不应该看到数据,只有查询数据库中数据的应用程序的某些用户才能看到这些信息。
所以我们想出了这个:
- 为每个包含加密列的表创建 1 个对称密钥
-
所有受证书保护的密钥,以及访问这些证书的存储过程现在定义为:
OPEN SYMMETRIC KEY Key_SalaryTable DECRYPTION BY CERTIFICATE SystemCertificate WITH PASSWORD = 'password';
(这意味着用于打开Key_SalaryTable的证书的密码被硬编码到存储过程中)
但是有一个问题,任何数据库管理员都可以只查看存储过程或直接调用存储过程就知道如何打开密钥查看工资表
即使我们限制每个用户对存储过程的访问,dba 也可以轻松地覆盖它并在重新设置限制之前提取信息,并且没有人会知道信息已被泄露。
谁有更好的解决方案?
【问题讨论】:
-
您需要将
Key_SalaryTable的密码保存在您的应用程序而不是数据库本身上,并将其作为参数传递给存储过程。 -
但我认为我们不能将密码作为参数传递到存储过程中,除非我们将其更改为动态。请看connect.microsoft.com/SQLServer/feedback/details/369270/…
-
另请参阅:无法将密钥传递给存储过程social.msdn.microsoft.com/Forums/en-US/…
-
如线程所示,您需要借助动态 SQL。
-
有更好的解决方案吗?动态 sql 似乎不是一个好习惯
标签: sql sql-server sql-server-2008 sql-server-2005