我正在尝试设置 SQL Server 对一些敏感数据使用单元级加密。这似乎很简单MSDN 上的这个例子:
- 使用强密码创建主密钥。
- 创建证书。
- 使用证书创建对称密钥。
- 使用
EncryptByKey
如下函数根据需要加密数据:EncryptByKey(Key_GUID('SensitiveData_Key_01'), MySensitiveDataColumn)
- 根据需要使用
DecryptByKey
如下函数解密数据:CONVERT(varchar, DecryptByKeyAutoCert(cert_ID('MyCertName'), NULL, MySensitiveDataColumn))
鉴于上述使用情况,假设我的服务器死机了。我需要在一台全新的 Windows 机器(或 VM)上重新安装 SQL Server,并从备份中恢复我的数据库。 如果我恢复数据库备份,加密/解密是否会继续正常工作?
如果不是,我需要保存/备份哪些数据才能在发生灾难性故障时恢复我的数据?
从图表来看有关加密层次结构的另一篇 MSDN 文章,我猜我需要备份以下部分或全部内容:
- 主密钥的密码
- 主密钥?
- 证书?
- 对称密钥?
答案1
经过进一步的研究,我发现了这篇文章“克隆”对称密钥。
您可以指示函数使用和CREATE SYMMETRIC KEY
生成对称密钥。稍后,您可以通过为和传递相同的值来重新生成相同的密钥。KEY_SOURCE
IDENTITY_VALUE
KEY_SOURCE
IDENTITY_VALUE
以下是一个简单的例子:
CREATE CERTIFICATE CreditCards
WITH SUBJECT = 'Customer Credit Card Numbers';
GO
CREATE SYMMETRIC KEY CreditCards_Key_01
WITH KEY_SOURCE = 'A pass phrase from which to derive the key.',
IDENTITY_VALUE = 'An identity phrase from which to generate a GUID for tagging data that is encrypted with a temporary key',
ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE CreditCards;
GO
OPEN SYMMETRIC KEY CreditCards_Key_01
DECRYPTION BY CERTIFICATE CreditCards
UPDATE MyTable
SET EncryptedCreditCardNumber = EncryptByKey(Key_GUID('CreditCards_Key_01'), CreditCardNumber);
GO
引用迈克尔·科尔斯的文章
“就我而言,默认要求 IDENTITY_VALUE 和 KEY_SOURCE 选项更有意义。”
不确定他们为什么不那样做,或者至少在 MSDN 上的例子中强调这一点!
答案2
您应该模拟您设想的灾难,并确认您可以在测试机器上恢复。您需要的一切在恢复过程中应该很快就会显现出来。