我在计算机A 上使用以下方法创建了证书和密钥。这是将密码列加密到varbinary
,然后在用户登录时将其解密。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ReallyLongPasswordHere';
CREATE CERTIFICATE MyCertificate01 WITH SUBJECT = 'My Certificate 01';
CREATE SYMMETRIC KEY SSN_Key_01 WITH ALGORITHM = TRIPLE_DES ENCRYPTION BY CERTIFICATE MyCertificate01 ;
然后(意外地)我需要将数据库复制到云VM(机器B )以测试新的架构更改。经过一番努力,我意识到我必须导出机器A的主密钥并用它来覆盖机器B的主密钥才能使解密工作。
因此,我在机器B上使用此代码来实现成功解密:RESTORE SERVICE MASTER KEY FROM FILE = 'C:\......\BackedUpServiceMasterKey'
DECRYPTION BY PASSWORD = 'BackupPassword' FORCE;
但是我现在意识到每当我启动新的测试机器时,主密钥总是需要更换。这样做有可能阻止任何其他数据库加密值被解密。
在重新使用证书/密钥和解密已存在的数据方面,我是否应该使用密码而不是主密钥创建证书?例如,
CREATE CERTIFICATE ... ENCRYPTION BY PASSWORD = 'password'
...并在每个新VM上使用相同的密码值来创建副本证书/密钥?
答案 0 :(得分:1)
可能是的,使用密码加密证书与使用主密钥一样安全。
你看,主密钥是一个对称的(意思是:弱)密钥,后者又用密码保护(服务主密钥也在这里发挥作用,当然,但由于它在任何给定的实例上都是常量,我们可以忽略它)。所以,无论如何,你最终都会使用某种密码,这对我来说使主密钥更加冗余。