CREATE SYMMETRIC KEY (Transact-SQL)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics

Genera una chiave simmetrica e ne specifica le proprietà in SQL Server.

Questa funzionalità non è compatibile con l'esportazione del database mediante Data Tier Application Framework (DACFx). Prima dell'esportazione, è necessario eliminare tutte le chiavi simmetriche.

Convenzioni di sintassi Transact-SQL

Nota

Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics.

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

key_name

Specifica il nome univoco con il quale la chiave simmetrica è nota all'interno del database. Parametro obbligatorio. Le chiavi temporanee vengono designate quando il key_name inizia con un segno di numero (#). Ad esempio: #temporaryKey900007. Non è possibile creare una chiave simmetrica con un nome che inizia con più di un #oggetto . Non è possibile creare una chiave simmetrica temporanea usando un provider EKM.

AUTHORIZATION owner_name

Specifica il nome dell'utente del database o del ruolo applicazione proprietario di questa chiave.

FROM PROVIDER provider_name

Specifica un nome e un provider EKM. La chiave non viene esportata dal dispositivo EKM. Il provider deve essere definito per primo usando l'istruzione CREATE PROVIDER . Per altre informazioni sulla creazione di provider di chiavi esterne, vedere Extensible Key Management (EKM).

Nota

Questa opzione non è disponibile in un database indipendente.

KEY_SOURCE = 'pass_phrase'

Specifica una passphrase da cui derivare la chiave.

IDENTITY_VALUE = 'identity_phrase'

Specifica una frase identificativa da cui generare un GUID per contrassegnare i dati crittografati con una chiave temporanea.

PROVIDER_KEY_NAME = 'key_name_in_provider'

Specifica il nome a cui viene fatto riferimento nel provider EKM.

Nota

Questa opzione non è disponibile in un database indipendente.

CREATION_DISPOSITION = { CREATE_NEW | OPEN_EXISTING }

Crea o esegue il mapping di una chiave simmetrica a un dispositivo Extensible Key Management.

  • CREATE_NEW

    Crea una nuova chiave nel dispositivo EKM. Se nel dispositivo esiste già una chiave, l'istruzione ha esito negativo con un errore.

  • OPEN_EXISTING

    Definisce il mapping di una chiave simmetrica di SQL Server a una chiave EKM esistente. Se CREATION_DISPOSITION = OPEN_EXISTING non viene specificato, l'impostazione predefinita è CREATE_NEW.

certificate_name

Specifica il nome del certificato utilizzato per crittografare la chiave simmetrica. Il certificato deve esistere nel database corrente.

'password'

Specifica una password dalla quale derivare una chiave TRIPLE_DES con cui proteggere la chiave simmetrica. password deve soddisfare i requisiti per i criteri password di Windows del computer che esegue l'istanza di SQL Server. Usare sempre password complesse.

symmetric_key_name

Specifica una chiave simmetrica usata per crittografare la chiave creata. La chiave specificata deve esistere nel database ed essere aperta.

asym_key_name

Specifica una chiave asimmetrica usata per crittografare la chiave creata. Tale chiave asimmetrica deve esistere nel database.

<algorithm>

Specifica l'algoritmo di crittografia.

Avviso

A partire da SQL Server 2016 (13.x), tutti gli algoritmi diversi da AES_128, AES_192 e AES_256 sono deprecati. Per usare algoritmi meno recenti (sconsigliato), è necessario impostare il database sul livello di compatibilità del database 120 o su un livello inferiore.

Osservazioni:

Quando viene creata una chiave simmetrica, la chiave simmetrica deve essere crittografata usando almeno una delle opzioni seguenti:

  • certificate
  • password
  • chiave simmetrica
  • chiave asimmetrica
  • PROVIDER

Una chiave può essere crittografata con più elementi di ogni tipo, ovvero una singola chiave simmetrica può essere crittografata contemporaneamente con più certificati, password, chiavi simmetriche e chiavi asimmetriche.

Attenzione

Se si crittografa una chiave simmetrica con una password anziché con un certificato o un'altra chiave, la password viene crittografata con l'algoritmo di crittografia TRIPLE DES. Per questo motivo, le chiavi create con un algoritmo di crittografia avanzato, come AES, vengono a loro volta protette con un algoritmo meno avanzato.

È possibile utilizzare la password facoltativa per crittografare la chiave simmetrica prima di distribuirla a più utenti.

Le chiavi temporanee sono di proprietà dell'utente che le crea e sono valide solo per la sessione corrente.

IDENTITY_VALUE genera un GUID con cui contrassegnare i dati crittografati con la nuova chiave simmetrica. Tale contrassegno può essere utilizzato per eseguire il mapping delle chiavi ai dati crittografati. Il GUID generato da una frase specifica è sempre uguale. Dopo che una frase è stata usata per generare un GUID, la frase non può essere riutilizzata finché nel database è presente almeno una chiave simmetrica che usa attivamente la frase. IDENTITY_VALUE è una clausola facoltativa; Tuttavia, è consigliabile usarlo quando si archiviano i dati crittografati con una chiave temporanea.

Non esiste alcun algoritmo di crittografia predefinito.

Importante

Non è consigliabile usare le crittografie di flusso RC4 e RC4_128 per proteggere i dati sensibili. SQL Server non codifica ulteriormente la crittografia eseguita con tali chiavi.

Le informazioni sulle chiavi simmetriche sono visibili nella vista del catalogo sys.symmetric_keys.

Le chiavi simmetriche non possono essere crittografate da chiavi simmetriche create dal provider di crittografia.

Chiarimento sugli algoritmi DES

  • La crittografia DESX è stata menzionata erroneamente. Le chiavi simmetriche create con ALGORITHM = DESX utilizzano in realtà la crittografia TRIPLE DES con una chiave a 192 bit. L'algoritmo DESX non viene fornito. Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.
  • Le chiavi simmetriche create con ALGORITHM = TRIPLE_DES_3KEY utilizzano TRIPLE DES con una chiave a 192 bit.
  • Le chiavi simmetriche create con ALGORITHM = TRIPLE_DES utilizzano TRIPLE DES con una chiave a 128 bit.

Deprecazione dell'algoritmo RC4

L'uso ripetuto dello stesso RC4 o RC4_128 KEY_GUID su blocchi di dati diversi comporta la stessa chiave RC4 perché SQL Server non fornisce automaticamente un salt. L'uso ripetuto della stessa chiave RC4 è un errore noto che causa una crittografia molto debole. Per questo motivo le parole chiave RC4 e RC4_128 sono deprecate. Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Avviso

L'algoritmo RC4 è supportato solo per motivi di compatibilità con le versioni precedenti. È possibile crittografare il nuovo materiale usando RC4 o RC4_128 solo quando il livello di compatibilità del database è 90 o 100. (Non consigliato.) Usare un algoritmo più recente, ad esempio uno degli algoritmi AES. In SQL Server il materiale crittografato usando RC4 o RC4_128 può essere decrittografato in qualsiasi livello di compatibilità.

Autorizzazioni

È richiesta l'autorizzazione ALTER ANY SYMMETRIC KEY per il database. Se AUTHORIZATION è specificato, è richiesta l'autorizzazione IMPERSONATE per l'utente del database o l'autorizzazione ALTER per il ruolo applicazione. Se la crittografia viene applicata con un certificato o una chiave asimmetrica, è richiesta l'autorizzazione VIEW DEFINITION per il certificato o la chiave asimmetrica. Solo gli account di accesso di Windows e di SQL Server e i ruoli applicazione possono avere chiavi simmetriche. I gruppi e i ruoli non possono possedere chiavi simmetriche.

Esempi

R. Creare una chiave simmetrica

Nell'esempio seguente viene creata una chiave simmetrica denominata JanainaKey09 con l'algoritmo AES 256 e la nuova chiave viene quindi crittografata con il certificato Shipping04.

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

B. Creare una chiave simmetrica temporanea

Nell'esempio seguente viene creata una chiave simmetrica temporanea chiamata #MarketingXXV dalla passphrase: The square of the hypotenuse is equal to the sum of the squares of the sides. Alla chiave viene associato un GUID generato dalla stringa Pythagoras e la chiave viene poi crittografata con il certificato 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. Creare una chiave simmetrica usando un dispositivo EKM (Extensible Key Management)

Nell'esempio seguente viene creata la chiave simmetrica denominata MySymKey utilizzando un provider denominato MyEKMProvider e il nome chiave KeyForSensitiveData. Si assegna l'autorizzazione a User1 presupponendo che l'amministratore di sistema abbia già registrato il provider denominato MyEKMProvider in SQL Server.

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

Vedi anche