SQL Server:如何限制对加密列的访问,甚至来自dba?

时间:2014-01-19 04:59:55

标签: sql sql-server sql-server-2008 sql-server-2005

我是数据库加密的新手。我们需要加密显示敏感信息的各种表中的某些列。我们遇到的问题是,任何有权访问数据库或其证书和对称密钥(甚至不是dbas)的人都不应该看到数据,并且只有查询数据库中数据的应用程序的某些用户才能看到这些信息。

所以我们想出了这个:

  • 为每个具有加密列的表创建了1个对称密钥
  • 所有受证书保护的密钥,以及访问这些证书的存储过程现在都定义为:

    OPEN SYMMETRIC KEY Key_SalaryTable 
    DECRYPTION BY CERTIFICATE SystemCertificate 
    WITH PASSWORD = 'password';
    

(这意味着用于打开Key_SalaryTable的证书的密码被硬编码到存储过程中)

但是有一个问题,任何数据库管理员都可以直接查看存储过程或直接调用存储过程知道如何打开密钥来查看工资表

即使我们限制每个用户对存储过程的访问权限,dba也可以在再次设置限制之前轻松覆盖并提取信息,并且没有人知道信息已被泄露。

有没有人有更好的解决方案?

2 个答案:

答案 0 :(得分:2)

另一种方法是从应用程序本身执行OPEN SYMMETRIC KEY / CLOSE SYMMETRIC KEY命令,而不是在存储过程中执行。顺便说一句,KEY在会话期间保持打开状态,直到其关闭或会话终止。确保应用程序和数据库之间的连接已加密“on the wire”。

在ASP.NET端,您可以将密码保存在加密的web.config部分。

答案 1 :(得分:1)

您可以将密码从应用程序作为参数传递给存储过程,
密码作为参数只能使用动态查询

  

- 打开对称密钥

     

DECLARE @open nvarchar(200)

     

SET @open ='OPEN SYMMETRIC KEY Key_SalaryTable DECRYPTION BY   证书SystemCertificate WITH PASSWORD ='''+ @password +''''   EXEC sp_executesql @open

     

- 查询

     

- 关闭对称键
     CLOSE SYMMETRIC KEY Key_SalaryTable