如何迁移具有数据库主密钥和加密证书的数据库

Ted*_*ins 5 sql-server encryption

大家早上好。

我对这个有点难住了。我们有一个数据库,我们对表中的一列进行了加密。这是我创建的主密钥以及证书和对称密钥。我需要将此数据库迁移到另一个 SQL 实例,但迁移数据库后,我无法解密信息。

帮助?

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'omitted';

CREATE CERTIFICATE SecureLoginPasswords  
   WITH SUBJECT = 'SecureLogin Customer Passwords for Website';  
GO  


CREATE SYMMETRIC KEY SSN_Key_01  
    WITH ALGORITHM = AES_256  
    ENCRYPTION BY CERTIFICATE SecureLoginPasswords;  
GO  
Run Code Online (Sandbox Code Playgroud)

Sea*_*ser 5

我需要将此数据库迁移到另一个 SQL 实例,但迁移数据库后,我无法解密信息。

您有一个数据库主密钥 (DMK),它受服务主密钥 (SMK) 和密码的保护。由于您要迁移到 SQL Server 的不同实例,您仍然可以通过密码访问 DMK,但自动密钥解密将不再起作用,因为 SMK 已更改。

修复很容易。将数据库恢复到新实例时,运行以下命令:

use databasename
go

open master key decryption by password = 'MyPassword'
go
alter master key drop encryption by service master key
go
alter master key add encryption by service master key
go
close master key
go
Run Code Online (Sandbox Code Playgroud)

这将删除 SMK 对 DMK 的加密,因为它无法在新实例上解密它。然后它会将通过 SMK 的加密添加回 DMK,以便自动密钥解密工作。

正如另一个答案所示,我没有说备份和恢复 SMK 的原因是它会影响实例上的所有数据库,而仅修复损坏的数据库不会对任何当前数据库造成任何其他问题。


Ted*_*ins 1

首先需要备份主密钥

backup service master key to file = 'c:\exportedmasterkey\MasterkeyLMI.SMK'
encryption by password = 'omitted'
go
Run Code Online (Sandbox Code Playgroud)

那么您需要将主密钥恢复到新实例。就我而言,我将数据库恢复到另一个带有证书和对称密钥的实例。

RESTORE SERVICE MASTER KEY FROM FILE = 'c:\exportedmasterkey\MasterkeyLMI.SMK' 
DECRYPTION BY PASSWORD = 'omitted'
Run Code Online (Sandbox Code Playgroud)

我所做的最后一步是为新用户授予证书和密钥的安全性。

GRANT CONTROL ON CERTIFICATE::[CertName] TO [User]
GRANT VIEW DEFINITION ON SYMMETRIC KEY::[KeyName] TO [User]
Run Code Online (Sandbox Code Playgroud)