CREATE SYMMETRIC KEY (Transact-SQL)

產生對稱金鑰及指定它的屬性。

主題連結圖示Transact-SQL 語法慣例

語法

CREATE SYMMETRIC KEY key_name [ AUTHORIZATION owner_name ]
    [ FROM PROVIDER Provider_Name ]
    WITH <key_options> [ , ... n ]
        |
    ENCRYPTION BY <encrypting_mechanism> [ , ... n ]
<key_options> ::=
    KEY_SOURCE = 'pass_phrase'
    |
    ALGORITHM = <algorithm>
    |
    IDENTITY_VALUE = 'identity_phrase'
    |
        PROVIDER_KEY_NAME = 'key_name_in_provider' 
    |
    CREATION_DISPOSITION = {CREATE_NEW | OPEN_EXISTING }
<algorithm> ::=
    DES | TRIPLE_DES | TRIPLE_DES_3KEY | RC2 | RC4 | RC4_128
    | DESX | AES_128 | AES_192 | AES_256 
<encrypting_mechanism> ::=
        CERTIFICATE certificate_name 
    |
    PASSWORD = 'password' 
    |
    SYMMETRIC KEY symmetric_key_name 
    |
    ASYMMETRIC KEY asym_key_name

引數

  • Key_name
    依據資料庫中已知之對稱金鑰指定唯一的名稱。暫時金鑰名稱的開頭應該是一個數字符號 (#)。例如,#temporaryKey900007。您無法建立名稱開頭有多個數字符號 (#) 的對稱金鑰。您無法使用 EKM 提供者建立暫時對稱金鑰。

  • AUTHORIZATION owner_name
    指定將擁有這個金鑰的資料庫使用者或應用程式角色的名稱。

  • FROM PROVIDER Provider_Name
    指定可延伸金鑰管理 (EKM) 提供者和名稱。此金鑰不會從 EKM 裝置匯出。您必須先使用 CREATE PROVIDER 陳述式定義提供者。如需有關建立外部金鑰的詳細資訊,請參閱<了解可延伸金鑰管理 (EKM)>。

  • KEY_SOURCE ='pass_phrase'
    指定要從其衍生金鑰的密碼片語。

  • IDENTITY_VALUE ='identity_phrase'
    指定要從中產生 GUID 來標記利用暫時金鑰加密的資料之識別片語。

  • key_name_in_provider
    指定在可延伸金鑰管理提供者中所參考的名稱。

  • CREATION_DISPOSITION = CREATE_NEW
    在可延伸金鑰管理裝置上建立新的金鑰。如果金鑰已存在於裝置上,陳述式會失敗,並傳回錯誤。

  • CREATION_DISPOSITION = OPEN_EXISTING
    將 SQL Server 對稱金鑰對應到現有的「可延伸金鑰管理」金鑰。如果未提供 CREATION_DISPOSITION = OPEN_EXISTING,就會預設為 CREATE_NEW。

  • certificate_name
    指定要用於加密對稱金鑰的憑證之名稱。這個憑證必須已存在於資料庫中。

  • 'password'
    指定 TRIPLE_DES 金鑰衍生自的密碼,此金鑰是用來確保對稱金鑰的安全。password 必須符合執行 SQL Server 執行個體之電腦的 Windows 密碼原則需求。您一定要使用增強式密碼。

  • symmetric_key_name
    指定要用於加密所要建立之金鑰的對稱金鑰。指定的金鑰必須已存在於資料庫中,且該金鑰必須是開啟的。

  • asym_key_name
    指定要用於加密所要建立之金鑰的非對稱金鑰。這個非對稱金鑰必須已存在於資料庫中。

備註

當建立對稱金鑰時,至少必須利用下列一項來加密對稱金鑰:憑證、密碼、對稱金鑰、非對稱金鑰或 PROVIDER。針對每一種類型,金鑰都可以有多個加密。換句話說,可以同時利用多個憑證、密碼、對稱金鑰及非對稱金鑰來加密單一對稱金鑰。

警告注意事項警告

如果是利用密碼 (而不是利用資料庫主要金鑰的公開金鑰) 來加密對稱金鑰,則會使用 TRIPLE DES 加密演算法。因此,利用強式加密演算法 (如 AES) 建立的金鑰,其本身的安全是由較弱的演算法來維護的。

將金鑰散發至多個使用者之前,可先利用選擇性的密碼來加密對稱金鑰。

暫時金鑰由建立它們的使用者擁有。暫時金鑰只能用於目前的工作階段。

IDENTITY_VALUE 會產生 GUID,這個 GUID 可用於標記利用新對稱金鑰加密的資料。這項標記作業可用於使金鑰符合加密的資料。特定片語產生的 GUID 永遠相同。在利用片語產生 GUID 之後,只要至少有一個工作階段正主動使用該片語,就無法重複使用該片語。IDENTITY_VALUE 是選擇性的子句;不過,當您要儲存利用暫時金鑰加密的資料時,我們建議您使用這個子句。

沒有預設的加密演算法。

重要注意事項重要事項

我們不建議您使用 RC4 和 RC4_128 資料流加密來保護敏感性資料。SQL Server 並不會對使用這類金鑰執行的加密功能進一步編碼。

您可以在 sys.symmetric_keys 目錄檢視中,看到有關對稱金鑰的資訊。

您無法利用從加密提供者所建立的對稱金鑰,加密對稱金鑰。

釐清有關 DES 演算法:

  • DESX 未正確命名。以 ALGORITHM = DESX 建立的對稱金鑰實際上使用具有 192 位元金鑰的 TRIPLE DES 加密。未提供 DESX 演算法。未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

  • 以 ALGORITHM = TRIPLE_DES_3KEY 建立的對稱金鑰使用具有 192 位元金鑰的 TRIPLE DES。

  • 以 ALGORITHM = TRIPLE_DES 建立的對稱金鑰使用具有 128 位元金鑰的 TRIPLE DES。

RC4 演算法的取代:

在不同的資料區塊上重複使用相同的 RC4 或 RC4_128 KEY_GUID,結果會是相同的 RC4 金鑰,因為 SQL Server 不會自動提供 Salt。重複使用相同的 RC4 金鑰是已知的錯誤,此錯誤會造成加密變弱。因此,我們取代了 RC4 和 RC4_128 關鍵字。未來的 Microsoft SQL Server 版本將移除這項功能。請勿在新的開發工作中使用此功能,並且儘速修改使用此功能的應用程式。

權限

需要資料庫的 ALTER ANY SYMMETRIC KEY 權限。如果指定了 AUTHORIZATION,則需要資料庫使用者的 IMPERSONATE 權限或應用程式角色的 ALTER 權限。如果是利用憑證或非對稱金鑰來加密,則需要憑證或非對稱金鑰的 VIEW DEFINITION 權限。只有 Windows 登入、SQL Server 登入,以及應用程式角色可以擁有對稱金鑰。群組和角色無法擁有對稱金鑰。

範例

A. 建立對稱金鑰

下列範例會利用 AES 256 演算法建立一個稱為 JanainaKey09 的對稱金鑰,然後利用憑證 Shipping04 加密新金鑰。

CREATE SYMMETRIC KEY JanainaKey09 WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE Shipping04;
GO

B. 建立暫時對稱金鑰

下列範例會從這個密碼片語中建立一個稱為 #MarketingXXV 的暫時對稱金鑰:The square of the hypotenuse is equal to the sum of the squares of the sides。金鑰由某 GUID 提供,該 GUID 是從字串 Pythagoras 產生且利用憑證 Marketing25 來加密的。

CREATE SYMMETRIC KEY #MarketingXXV 
     WITH ALGORITHM = AES_128,
     KEY_SOURCE 
     = 'The square of the hypotenuse is equal to the sum of the squares of the sides',
     IDENTITY_VALUE = 'Pythagoras'
     ENCRYPTION BY CERTIFICATE Marketing25;
GO

C. 使用可延伸金鑰管理 (EKM) 裝置建立對稱金鑰

下列範例會使用稱為 MyEKMProvider 的提供者與 KeyForSensitiveData 的金鑰名稱,建立稱為 MySymKey 的對稱金鑰。它會將授權指派給 User1,並假設系統管理員已經在 SQL Server 中,註冊稱為 MyEKMProvider 的提供者。

CREATE SYMMETRIC KEY MySymKey
AUTHORIZATION User1
FROM PROVIDER EKMProvider
WITH
PROVIDER_KEY_NAME='KeyForSensitiveData',
CREATION_DISPOSITION=OPEN_EXISTING;
GO