2013-10-30 36 views
0

这是一个有点这个问题通常是如何相反的asked--我用下面创建一个数据库主密钥,证书,对称密钥:恢复迁移后不需要解密数据的SQL服务主密钥?

下面是如何创建的证书/键(显然与真正的密码):

CREATE MASTER KEY ENCRYPTION 
BY PASSWORD = '123456' 

CREATE CERTIFICATE EncryptionCert 
WITH SUBJECT = 'EncryptionCert' 

CREATE SYMMETRIC KEY SymmetricKey 
WITH ALGORITHM = AES_256 
ENCRYPTION BY CERTIFICATE EncryptionCert; 

我再加密使用该密钥的一些数据,备份的数据库,并将其恢复到不同的盒子。

我的期望是,我将无法解密数据,直到我首次将旧服务主密钥从旧服务器迁移出去,但实际上,在恢复后无需提供单个证书或密码即可立即执行此操作。

我推测这是因为我使用Amazon EC2图像来创建盒子,所以我假定从该图像创建的每个盒子都具有相同的服务主密钥。

试图迫使服务密钥改变,我跑:

alter service master key regenerate 

两个箱子。

我开始使用新的数据库,新的密钥/证书等,而这次,当我将备份移动到新盒子时,我无法自动读取数据,但我必须先提供我创建的数据库主密钥的密码。一旦我做到了,我就能够获得数据。

从我读过的所有内容来看,如果不先移动服务主密钥,我将无法解密主密钥。

我担心不需要的服务主密钥仍然是由于我的测试环境的一个奇怪的问题,并且我可能会在一年内搞砸,因为我真的试图这样做。

任何人都可以阐明这里发生的事情吗? SQL中有什么更改使得不需要移动服务主密钥,或者是否创建数据库主密钥的方式使其不必要?或者我收回可能的虚假结果?

+2

http://dba.stackexchange.com/可能是一个更好的地方要问这个问题。 –

+0

谢谢,它也复制在那里。 – user1279779

回答

0

Matt Bowler在数据库加密方面拥有卓越的article。问题可能是服务器主密钥被加密的方式。您的实例是否可能由相同的服务帐户运行?

服务主密钥:密钥层次结构的顶部是服务主密钥。每个SQL Server实例有一个,它是一个对称密钥,并存储在master数据库中。用于加密首次启动SQL Server时生成的数据库主密钥,链接服务器密码和凭证。

没有与此密钥关联的用户可配置密码 - 它由SQL Server服务帐户和本地计算机密钥加密。启动时,SQL Server可以使用这些解密中的任何一种来打开服务主密钥。如果其中一个失败 - SQL Server将使用另一个并'修复'失败的解密(如果两者都失败 - SQL Server将会出错)。这是为了解决像故障转移后本地机器密钥会不同的情况。这也是使用SQL Server配置管理器更改服务帐户的一个原因 - 因为此时服务主密钥加密会正确重新生成。

http://mattsql.wordpress.com/2012/11/13/migrating-sql-server-databases-that-use-database-master-keys/