我有一个数据库已从旧的SQL Server 2008R2实例移到SQL Server 2012 AlwaysOn群集中。数据库中有几个字段使用SQL Server内置加密功能(主密钥,证书,对称密钥)进行加密。
我在QA AO实例上运行了以下命令(与旧服务器上运行的步骤相同):
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
CREATE CERTIFICATE myCert
WITH SUBJECT = 'password'
CREATE SYMMETRIC KEY myKeyName
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE myCert
此外,我必须运行以下命令才能正确解密数据:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
当我运行此命令时,我会看到所有解密的数据:
OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users
CLOSE SYMMETRIC KEY myKeyName
到目前为止一切顺利。但是,如果我在我的生产AO群集上运行这些相同的步骤:
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users
为密码返回NULL。为了让这更令人抓狂,这句话(在QA环境中运行)解密了两个数据库中的所有内容:
OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert
SELECT TOP 1000
userid,
CONVERT(nVARCHAR(255),DECRYPTBYKEY(password))
FROM users
SELECT TOP 1000
userid,
CONVERT(nVARCHAR(255),DECRYPTBYKEY(password))
FROM PRODUCTIONAO.prod_database.dbo.users
CLOSE SYMMETRIC KEY myKeyName
我不确定为什么这会对我的QA实例起作用,但不适用于我的生产实例。任何帮助将不胜感激!
答案 0 :(得分:3)
您上次查询的原因是由于您使用QA实例的密钥/证书来解密生产数据。在QA中,您可以使用数据库主密钥(DMK)自动解密证书,因为它由QA服务主密钥(SMK)加密,如下所示:
Service Master Key (QA) Database Master Key (QA) Certificate (QA) Symmetric Key (QA) Data (Prod)
在prod中,您有一个不同的SMK,因此打开DMK的唯一选择是使用密码。您似乎在QA环境中运行了以下内容,但未在prod中运行:
/* Add service master key encryption to the database master key */
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
在prod中试试这个:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users
CLOSE SYMMETRIC KEY myKeyName
如果返回数据,则需要将SMK加密添加到生产中的DMK(第一个脚本)。另一个选项是从源实例备份SMK并在辅助节点上恢复它。我只在HA用例中推荐这种情况,其中实例是故障转移伙伴,并且两者都在相同的环境中。在QA和prod之间共享SMK是一种不好的做法。
答案 1 :(得分:-1)
创建数据库主密钥时,服务器会保存2个密钥版本。一个版本由主服务密钥加密,默认情况下由服务器使用。第二个版本由您在创建数据库主密钥时提供给服务器的密码加密。通常不使用此版本。将数据库移动到其他环境(在您的情况下为生产)时,新服务器具有不同的主服务密钥。由于它不是用于加密数据库主密钥的服务密钥,因此它也不能用于打开数据库的主密钥。您应该使用使用密码加密的版本。您需要使用密码打开主密钥,然后使用新服务密钥对其进行加密并关闭它。执行此操作后,数据库的主密钥可以使用主服务密钥,因此您无需再次执行此操作。
步骤/代码:
通过密码='WriteYouOriginalPasswordHere'
打开主密钥解密更改主密钥按服务主密钥添加加密
关闭主密钥