存储加密和解密列的密钥信息的最佳实践

时间:2015-11-02 16:10:35

标签: sql-server entity-framework encryption

我有一个Web服务,它将使用SQL Server数据库来存储必须加密和解密的内容。它将定期查询表并获取要在处理中使用的解密形式的数据。

我已按照this example here设置了一个证书和对称密钥以应用于该列并且它可以正常工作。

我不确定在桌面上执行CRUD操作时使用密钥名称的最佳做法是什么。我正在使用实体框架,它并不天真地支持加密和解密。

所以,我想到的可能性:

  1. 创建包装CRUD操作的存储过程。将密钥和证书的名称存储在存储过程本身中。当然,这使得某人可以轻松调用此存储过程来获取解密数据,但我相信如果将数据库移动到另一台计算机,该方法将无法工作,除非您能够为数据库创建根证书。 例如
  2. 与#1类似,但包含密钥和证书名称的存储过程的参数。将密钥和证书名称存储为我的Web服务中的硬编码字符串。这并不是很好,因为程序与证书/密钥的名称完全相关,但我想它已经与表的定义相结合。
  3. 这两个选项都有效,但从最佳实践和安全角度来看,这里可能有更好的路线。有哪些更好的选择?

    第1项的例子:

    CREATE PROCEDURE GetDecryptedCustomers
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
    
        -- reading the data
    OPEN SYMMETRIC KEY SymmetricKey1
    DECRYPTION BY CERTIFICATE Certificate1;
    
    -- Now list the original ID, the encrypted ID 
    SELECT Customer_id, CONVERT(varchar, DecryptByKey(Credit_card_number_encrypt)) AS 'Decrypted Credit Card Number'
    FROM Customer_data;
    
     -- Close the symmetric key
        CLOSE SYMMETRIC KEY SymmetricKey1;
       END 
       GO
    

1 个答案:

答案 0 :(得分:0)

在SQL Server 2016中,有一项名为始终加密 here

的新功能