Ben*_*hul 8 sql-server encryption
我有一个场景,我将数据库从一台服务器恢复到另一台服务器。在源服务器上,数据库主密钥 (DMK) 使用密码和服务主密钥 (SMK) 进行加密。当我去将它恢复到新服务器时,行中sys.key_encryptions
仍然说它是由 SMK 加密的。但事实并非如此,因为两台服务器之间的 SMK 不匹配。是否有任何编程方式来验证 DMK 确实使用此服务器的SMK 进行了加密?
为了以编程方式确定当前 SMK 是否用于保护 DMK,您应该能够简单地尝试需要 DMK 的操作。此类操作需要首先解密 DMK 才能使用它。假设您没有明确打开 DMK(使用创建时提供的密码),解密 DMK 将需要 SMK。如果当前的 SMK 不是正确的SMK,则 DMK 不会被自动解密,操作将失败。所以:
如果您有一个保证存在于正在恢复的数据库中的证书,请尝试使用它:
SELECT SIGNBYCERT( CERT_ID( '{certificate_name}' ), 'test' );
Run Code Online (Sandbox Code Playgroud)
那应该返回一个非NULL
VARBINARY 值。如果返回值为NULL
,则需要重新生成 DMK(按照以下说明)。
如果正在恢复的数据库中不保证存在任何证书,则尝试创建一个。如果可以使用 SMK 自动解密 DMK,则将创建证书,否则操作将失败:
BEGIN TRY
CREATE CERTIFICATE [TestCert] WITH SUBJECT = 'yadda yadda yadda';
DROP CERTIFICATE [TestCert];
PRINT 'All good, yo!';
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
END CATCH;
Run Code Online (Sandbox Code Playgroud)但是,由于您刚刚恢复了来自另一个实例的数据库,并且没有将另一个实例的 SMK 恢复到新实例中,因此可以安全地假设答案是:“不,DMK没有使用此服务器的 SMK 进行加密”。
这是一个预期的场景,需要执行以下步骤来补救:
USE [newly_restored_db];
OPEN MASTER KEY DECRYPTION BY PASSWORD = '{password}'; -- password used to protect DMK
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '{password}';
CLOSE MASTER KEY;
Run Code Online (Sandbox Code Playgroud)
状态的 MSDN 页面CREATE MASTER KEY
(已添加强调):
对于 SQL Server 和并行数据仓库,主密钥通常由服务主密钥和至少一个密码保护。如果数据库被物理移动到不同的服务器(日志传送、恢复备份等),数据库将包含由原始服务器服务主密钥加密的主密钥的副本(除非使用 ALTER 明确删除此加密MASTER KEY DDL),以及由在 CREATE MASTER KEY 或后续 ALTER MASTER KEY DDL 操作期间指定的每个密码加密的副本。为了恢复主密钥,以及在数据库移动后使用主密钥作为密钥层次结构中的根加密的所有数据,用户必须[到]使用 [the] OPEN MASTER KEY 语句中的一个用于保护主密钥的密码[s]、还原主密钥的备份,或在新服务器上还原原始服务主密钥的备份。
状态的 MSDN 页面OPEN MASTER KEY
:
首次将数据库附加或还原到 SQL Server 的新实例时,数据库主密钥(由服务主密钥加密)的副本尚未存储在服务器中。您必须使用OPEN MASTER KEY语句来解密数据库主密钥 (DMK)。解密 DMK 后,您可以选择在将来启用自动解密,方法是使用ALTER MASTER KEY REGENERATE语句为服务器提供使用服务主密钥 (SMK) 加密的 DMK 副本。当数据库从较早版本升级后,应重新生成 DMK 以使用较新的 AES 算法。有关重新生成 DMK 的详细信息,请参阅ALTER MASTER KEY (Transact-SQL). 重新生成 DMK 密钥以升级到 AES 所需的时间取决于受 DMK 保护的对象数量。重新生成 DMK 密钥以升级到 AES 只需要一次,并且作为密钥轮换策略的一部分对未来的重新生成没有影响。
ALTER MASTER KEY的 MSDN 页面指出:
REGENERATE 选项重新创建数据库主密钥及其保护的所有密钥。密钥首先用旧的主密钥解密,然后用新的主密钥加密。除非主密钥已被泄露,否则应在需求低的时期安排这种资源密集型操作。
归档时间: |
|
查看次数: |
21237 次 |
最近记录: |