使用AlwaysOn群集进行加密

时间:2015-06-17 13:27:39

标签: sql-server encryption alwayson

我有一个数据库已从旧的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实例起作用,但不适用于我的生产实例。任何帮助将不胜感激!

2 个答案:

答案 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'

打开主密钥解密

更改主密钥按服务主密钥添加加密

关闭主密钥