【问题标题】:How to backup Symmetric Key in SQL Server?如何在 SQL Server 中备份对称密钥?
【发布时间】:2017-04-23 06:14:37
【问题描述】:

我使用下一个代码来创建 SQL 加密密钥

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Pass>'
CREATE CERTIFICATE MyEncryptCert WITH SUBJECT = 'Descryption', EXPIRY_DATE = '2115-1-1'
CREATE SYMMETRIC KEY MySymmetricKey WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE MyEncryptCert

我如何加密数据

OPEN SYMMETRIC KEY MySymmetricKey DECRYPTION BY CERTIFICATE MyEncryptCert
SET @Result = ENCRYPTBYKEY(KEY_GUID('MySymmetricKey'), '<String to encrypt>')
CLOSE SYMMETRIC KEY MySymmetricKey

我能够备份数据库主密钥和证书。

BACKUP MASTER KEY TO FILE = 'c:\temp\key' ENCRYPTION BY PASSWORD = '<Pass>';
BACKUP CERTIFICATE MyEncryptCert TO FILE = 'c:\temp\cert' WITH PRIVATE KEY(ENCRYPTION BY PASSWORD='<Pass>', FILE='C:\temp\cert.pvk')

但我无法备份对称密钥。没有它,如果我将加密表移动到另一个数据库,我将无法解密加密数据。

有什么解决办法吗?

附注我尝试了下一个代码,但对我来说似乎不安全,因为如果您知道 KEY_SOURCE 和 IDENTITY_VALUE,您实际上不需要原始数据库主密钥和证书来解密数据

CREATE SYMMETRIC KEY MySymmetricKey WITH KEY_SOURCE = '<Pass1>', ALGORITHM = AES_256, IDENTITY_VALUE = '<Pass2>' ENCRYPTION BY CERTIFICATE MyEncryptCert

【问题讨论】:

    标签: sql sql-server database encryption symmetric-key


    【解决方案1】:

    如果您需要能够复制对称密钥,您应该提供KEY_SOURCEIDENTITY_VALUE。您的评估是正确的,因为通过了解这两个值,您可以重新创建密钥。观察以下代码,这表明我可以通过使用“第一个”密钥加密值、删除密钥、使用相同的 KEY_SOURCEIDENTITY_VALUE 重新生成它,然后创建相同的密钥两次作为证据解密加密值。

    CREATE SYMMETRIC KEY MySymmetricKey WITH 
        KEY_SOURCE = '<Pass1>', 
        ALGORITHM = AES_256, 
        IDENTITY_VALUE = '<Pass2>' 
        ENCRYPTION BY Password = 'foobar!23'
    
    open symmetric key MySymmetricKey
        decryption by password = 'foobar!23';
    declare @encrypted varbinary(max);
    select @encrypted = ENCRYPTBYKEY(KEY_GUID('MySymmetricKey'), 'my secrets!');
    
    close symmetric key MySymmetricKey;
    drop symmetric key MySymmetricKey;
    
    CREATE SYMMETRIC KEY MySymmetricKey WITH 
        KEY_SOURCE = '<Pass1>', 
        ALGORITHM = AES_256, 
        IDENTITY_VALUE = '<Pass2>' 
        ENCRYPTION BY Password = 'foobar!23'
    
    open symmetric key MySymmetricKey
        decryption by password = 'foobar!23';
    
    select cast(DECRYPTBYKEY(@encrypted) as varchar(max))
    close symmetric key MySymmetricKey;
    drop symmetric key MySymmetricKey;
    

    【讨论】:

    • 感谢您的回答。结论是我无法备份对称密钥。
    • 不是直接的。但是您可以通过在创建时提供相同的密钥材料来重新创建相同的密钥。这和备份一样好。
    • 警告复制代码的人:ENCRYPTION BY Password 不建议在 CREATE SYMMETRIC KEY 语句中使用,因为密钥将使用 3DES 保护,这是一种比实际保护的算法 (AES256) 更弱的算法。请改用证书。 docs.microsoft.com/en-us/sql/t-sql/statements/…
    【解决方案2】:

    你不能。

    正如另一个答案中所述,可以使用相同的参数重新创建相同的对称密钥,但这在不同版本的 SQL Server 之间不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2014-08-04
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多