CREATE MASTER KEY (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

在資料庫中建立資料庫主要金鑰。

重要

  • 您應該使用 BACKUP MASTER KEY 來備份主要金鑰,然後將該備份儲存在安全的異地位置。
  • 在 SQL Server 中,您也應該使用 BACKUP SERVICE MASTER KEY 來備份服務主要金鑰,然後將該備份儲存在安全的異地位置。

Transact-SQL 語法慣例

Syntax

CREATE MASTER KEY [ ENCRYPTION BY PASSWORD ='password' ]
[ ; ]

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

PASSWORD ='password'

用來加密資料庫中主要金鑰的密碼。 password 必須符合執行 SQL Server 執行個體之電腦的 Windows 密碼原則需求。 password 在 SQL Database 和 Azure Synapse Analytics 中是選擇性的。

備註

資料庫主要金鑰是對稱金鑰,用來保護資料庫記憶體的憑證和非對稱密鑰的私鑰,以及資料庫範圍認證中的秘密。 建立資料庫主要金鑰時,系統會利用 AES_256 演算法和使用者提供的密碼來加密主要金鑰。 在 SQL Server 2008 (10.0.x) 和 SQL Server 2008 R2 (10.50.x) 中,會使用三重 DES 演算法。 若要啟用主要金鑰的自動解密,必須使用服務主要金鑰來加密該金鑰複本,並將其同時儲存在資料庫和 master 中。 通常,每當主要金鑰變更時,儲存在 master 中的複本便會以無訊息方式更新。 您可以使用 ALTER MASTER KEY 的 DROP ENCRYPTION BY SERVICE MASTER KEY 選項來變更這個預設值。 服務主要金鑰未加密的主要金鑰必須使用 OPEN MASTER KEY 語句和密碼來開啟

mastersys.databases 目錄檢視的 is_master_key_encrypted_by_server 資料行會指出資料庫主要金鑰是否已透過服務主要金鑰加密。

您可以在 sys.symmetric_keys 目錄檢視中,看到有關資料庫主要金鑰的資訊。

針對 SQL Server 和平行處理資料倉儲,主要金鑰通常會受到服務主要金鑰及至少一個密碼保護。 若將資料庫實際移動到不同伺服器 (記錄傳送、還原備份等),資料庫會包含以原始伺服器服務主要金鑰加密的主要金鑰複本 (除非已使用 ALTER MASTER KEY DDL 明確移除此加密),以及在 CREATE MASTER KEY 或後續 ALTER MASTER KEY DDL 作業期間由每個指定密碼加密的複本。 若要在移動資料庫之後復原主要金鑰,以及所有使用主要金鑰作為金鑰階層中根來加密的資料,使用者必須使用 OPEN MASTER KEY 陳述式透過用來保護主要金鑰的其中一個密碼來還原主要金鑰的備份,或是在新伺服器上還原原始服務主要金鑰的備份。

針對 SQL 資料庫 和 Azure Synapse Analytics,密碼保護不會被視為安全機制,以避免在資料庫可能從一部伺服器移到另一部伺服器的情況下,因為主要密鑰上的服務主要密鑰保護是由 Microsoft Azure 平臺所管理。 因此,主要金鑰密碼在 SQL Database 和 Azure Synapse Analytics 中是選擇性的。

針對 SQL 資料庫,可以自動建立資料庫主要密鑰,以保護用於稽核的資料庫範圍認證中的秘密,以及需要資料庫範圍認證向外部資源進行驗證的其他功能,例如 Azure 儲存體 帳戶。 主要金鑰是使用強隨機選取的密碼來建立。 用戶無法在邏輯 master 資料庫上建立主要密鑰。 Microsoft 無法辨識主要密鑰密碼,且在建立之後無法探索。 基於這個理由,建議您先建立資料庫主要密鑰,再建立資料庫範圍認證。

服務主要金鑰和資料庫主要金鑰,皆使用 AES-256 演算法加以保護。

權限

需要資料庫的 CONTROL 權限。

範例

使用下列範例,在資料庫中建立資料庫主要金鑰。 該金鑰是使用密碼來加密。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';
GO

確認新金鑰 ##MS_DatabaseMasterKey## 是否存在:

SELECT * FROM sys.symmetric_keys;
GO