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