【问题标题】:SQL Server: how to limit access to encrypted column, even from dba?SQL Server:如何限制对加密列的访问,甚至来自 dba?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    --打开对称密钥

    声明@open nvarchar(200)

    SET @open = '打开对称密钥 Key_SalaryTable DECRYPTION BY 证书 SystemCertificate WITH PASSWORD =''' + @password + ''''
    执行 sp_executesql @open

    -- 查询

    --关闭对称键
    CLOSE SYMMETRIC KEY Key_SalaryTable

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2017-01-13
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多