使用AlwaysOn群集进行加密

dpa*_*ons 10 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 
Run Code Online (Sandbox Code Playgroud)

另外,我必须运行以下命令才能正确解密数据:

 OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
 ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,我会看到所有解密的数据:

OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert 
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from  users
CLOSE SYMMETRIC KEY myKeyName
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是,如果我在生产AO群集上运行这些相同的步骤,则此查询:

select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from  users
Run Code Online (Sandbox Code Playgroud)

为密码返回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
Run Code Online (Sandbox Code Playgroud)

我不确定为什么这会在我的QA实例上起作用,但不能在我的生产实例上起作用.任何帮助将不胜感激!

Cha*_*arr -1

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

\n\n

步骤/代码:

\n\n

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

\n\n

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

\n\n

关闭主密钥

\n