繁体   English   中英

使用AlwaysOn群集进行加密

[英]Encryption with an AlwaysOn cluster

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

您上次查询的原因是由于您使用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

试试这个:

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是一种不好的做法。

创建数据库主密钥时,服务器将保存2个密钥版本。 一个版本由主服务密钥加密,默认情况下由服务器使用。 第二个版本由您在创建数据库主密钥时提供给服务器的密码加密。 通常不使用此版本。 将数据库移动到其他环境(在您的情况下为生产)时,新服务器具有不同的主服务密钥。 由于它不是用于加密数据库主密钥的服务密钥,因此它也不能用于打开数据库的主密钥。 您应该使用使用密码加密的版本。 您需要使用密码打开主密钥,然后使用新服务密钥对其进行加密并关闭它。 执行此操作后,数据库的主密钥可以使用主服务密钥,因此您无需再次执行此操作。

步骤/代码:

通过密码打开主密钥解密='WriteYouOriginalPasswordHere'

alter master key按服务主密钥添加加密

关闭主密钥

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM