Sql-Server

正確服務主密鑰加密的數據庫主密鑰?

  • January 9, 2017

我的客戶經常執行我們將數據庫從 prod 環境移動到較低環境的過程(使用 prod 數據庫刷新 QA 等)。這些數據庫上有數據庫主密鑰。我們將這些重新加密到目標伺服器上的服務主密鑰中沒有問題,但這是令人討厭的部分:

  1. sys.databases 表示 DMK 已經加密(儘管使用源服務的 SMK)
  2. 我們無法判斷 DMK 是否被目前 SMK 加密(檢查了所有加密 DMV)
  3. sys.symmetric_keys 中的 SMK 簽名始終為 0x01(在伺服器之間不是唯一的)。

這本身不是問題。修復總是將 DMK 重新加密為 SMK。我們只是想知道它是否已經完成。有人有什麼技巧嗎?

謝謝,埃里克

按照網上的書

“master 中 sys.databases 目錄視圖的 is_master_key_encrypted_by_server 列指示數據庫主密鑰是否被服務主密鑰加密。”

這是連結http://technet.microsoft.com/en-us/library/ms174382.aspx

我們只是想知道它是否已經完成。有人有什麼技巧嗎?

嗯,是的,實際上。

正如我對一個非常相似的問題的以下回答中更充分地解釋的那樣:

如何檢查數據庫主密鑰加密是否有效?

由於需要服務主密鑰(正確的)才能將數據庫主密鑰用於未明確指定密碼的操作,因此您只需嘗試使用數據庫主密鑰。如果操作成功,則目前的服務主密鑰是正確的。但是如果它失敗了,那麼你就知道數據庫主密鑰需要一些其他的服務主密鑰。

兩個足夠簡單的選項是:

  • 如果您有一個保證存在於正在恢復的數據庫中的證書,請嘗試使用它:
USE [newly_restored_db];

IF ( SIGNBYCERT( CERT_ID( '{certificate_name}' ), 'test' ) IS NULL)
BEGIN
 OPEN MASTER KEY DECRYPTION BY PASSWORD = '{password}'; -- password used to protect DMK
 ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '{password}';
 CLOSE MASTER KEY;
 PRINT 'All fixed, yo!';
END;
ELSE
BEGIN
 PRINT 'All good, yo!';
END;
  • 如果不能保證正在恢復的數據庫中存在證書,則嘗試創建一個。如果 SMK 可用於自動解密 DMK,則將創建證書,否則操作將失敗:
USE [newly_restored_db];

BEGIN TRY
 CREATE CERTIFICATE [TestCert] WITH SUBJECT = 'yadda yadda yadda';
 DROP CERTIFICATE [TestCert];
 PRINT 'All good, yo!';
END TRY
BEGIN CATCH
 OPEN MASTER KEY DECRYPTION BY PASSWORD = '{password}'; -- password used to protect DMK
 ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '{password}';
 CLOSE MASTER KEY;
 PRINT 'All fixed, yo!';
END CATCH;

引用自:https://dba.stackexchange.com/questions/10653