10

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

4

2 回答 2

3

您上一个查询有效的原因是您使用 QA 实例的密钥/证书来解密生产数据。在 QA 中,您可以使用数据库主密钥 (DMK) 自动解密证书,因为它由 QA 服务主密钥 (SMK) 加密,如下所示:

服务主密钥 (QA)
  数据库主密钥 (QA)
    证书(质量保证)
      对称密钥 (QA)
        数据(产品)

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

于 2016-12-08T18:42:14.800 回答
-1

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

步骤/代码:

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

更改主密钥通过服务主密钥添加加密

关闭主密钥

于 2015-07-01T15:13:40.010 回答