【问题标题】:Restoring database with encrypted columns where destination SMK is different使用目标 SMK 不同的加密列恢复数据库
【发布时间】:2017-12-21 21:26:36
【问题描述】:

类似的问题是asked before,但我相信情况略有不同,我也想了解任何替代解决方案。我现在处于信息过载阶段:\

SERVER A 上的数据库中的某些列已使用这种方法加密:

-- Key creation
USE [master];
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ComplexPasswordHere';
CREATE CERTIFICATE MyDbCertificate01 WITH SUBJECT = 'MyDatabase Certificate 01';
CREATE SYMMETRIC KEY SSN_Key_01 WITH ALGORITHM = TRIPLE_DES ENCRYPTION BY CERTIFICATE MyDbCertificate01;

-- Decryption example
USE [MyDB];
GO
OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE MyDbCertificate01;
SELECT
  CONVERT(nvarchar(50), DECRYPTBYKEY(PasswordEnc)) AS [Password]
FROM
  [tbl_Users]
CLOSE SYMMETRIC KEY SSN_Key_01;

此数据库需要恢复到 SERVER B,它已经有一个服务主密钥,用于管理该服务器上其他数据库的加密。

根据研究,其他作者表示我们可以使用 FORCE 备份/恢复 SMK,但我认为这会消除目标服务器上现有的加密:

问题就出在这里:当前机器 DMK 无法使用 使用另一个 SMK 加密的数据。它将无法解密,因为 SMK 变了。 Source

假设以上内容仍然准确,是否可以备份数据库以及证书,以使目标服务器能够成功解密数据?

有没有其他方法可以在不破坏目标服务器现有数据的情况下实现这一点?

【问题讨论】:

    标签: sql-server encryption sql-server-2012


    【解决方案1】:

    因此,随着压力的增加,我决定拿出我的钱包并设置一个新的 Azure VM 测试服务器,以保证全新的设置。

    解决方案如下(尽可能提供链接)。

    1。在不同的服务器上恢复/克隆数据库

    使用instructions here(SSMS 恢复对话框,覆盖必要的字段)恢复数据库。 此时,加密的数据库字段还不能解密

    2。恢复数据库主密钥

    一旦恢复,事实证明 this answer on dba.stackexchange 就是所需要的(修改以适应我的问题)。

    USE [MyRestoredDatabase]
    GO
    OPEN MASTER KEY DECRYPTION BY PASSWORD = 'ComplexPasswordHere'; -- This is the password used for --> CREATE MASTER KEY ENCRYPTION BY PASSWORD '....';
    ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY;
    GO
    

    从那时起,DECRYPTBYKEY() 和其他加密工作正常。

    如果我的以下假设不正确,请发布一个答案以澄清我错在哪里,我会改为接受你的答案...

    根据我对新 VM 的研究,似乎在备份数据库时,证书和对称密钥会作为数据库的一部分自动备份(这很有意义)。因此,最后一步是配置已恢复的现有数据库主密钥,使其受目标计算机上的服务主密钥的控制。 SSMS 会自动重新布线。

    【讨论】:

      【解决方案2】:

      忘记了如何再次执行此操作的详细信息,不得不去寻找一些额外的信息以供任何可能需要的人使用。

      至少有两种方法可以完成此操作,如果您无法掌握数据库密钥的密码但您是 SQL Server 管理员,则第二种方法很有用。

      在这种情况下,您只需导出服务器主密钥并覆盖目标服务器中的主密钥在恢复备份数据库之前。当然,这仅适用于新服务器,或者尚未使用证书的服务器,或者在极端情况下,如果您知道目标中所有证书的密钥密码并且可以按照 EvilDr 的描述重置它们。

      USE MASTER
      GO
      --On original SQL Server set password
      BACKUP SERVICE MASTER KEY TO FILE = 'C:\temp\smk' ENCRYPTION BY PASSWORD = 'password';
      GO
      --On new SQL Server - BEFORE restoring backed up database (or else conflict)
      RESTORE SERVICE MASTER KEY FROM FILE = 'C:\temp\smk' DECRYPTION BY PASSWORD = 'password';
      GO
      --Then restore database from backup with certificate and key included
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-08
        • 2012-10-20
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        相关资源
        最近更新 更多