CREATE SYMMETRIC KEY (Transact-SQL)
S’applique à : SQL Server base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics
Génère une clé symétrique et spécifie ses propriétés dans SQL Server.
Cette fonctionnalité est incompatible avec l'exportation de base de données à l'aide de l'infrastructure d'application de la couche Données. Vous devez supprimer toutes les clés symétriques avant l'exportation.
Conventions de la syntaxe Transact-SQL
Notes
Cette syntaxe n’est pas prise en charge par le pool SQL serverless dans Azure Synapse Analytics.
Syntaxe
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
Arguments
key_name
Spécifie le nom unique sous lequel la clé symétrique est connue dans la base de données. Il s’agit d’un paramètre obligatoire. Des clés temporaires sont désignées lorsque key_name commence par un croisillon (#
). Par exemple : #temporaryKey900007
. Vous ne pouvez pas créer une clé symétrique dont le nom commence par plusieurs #
. Vous ne pouvez pas créer de clé symétrique temporaire à l'aide d'un fournisseur EKM.
AUTHORIZATION owner_name
Spécifie le nom de l'utilisateur de base de données ou du rôle d'application auquel appartient la clé.
FROM PROVIDER provider_name
Spécifie un fournisseur EKM (Extensible Key Management) et un nom. La clé n'est pas exportée à partir de l’appareil EKM. Le fournisseur doit d'abord être défini à l'aide de l'instruction CREATE PROVIDER
. Pour plus d’informations sur la création de fournisseurs de clés externes, consultez Gestion de clés extensible (EKM).
Remarque
Cette option n'est pas disponible dans une base de données autonome.
KEY_SOURCE = 'pass_phrase'
Spécifie une phrase secrète à partir de laquelle la clé doit être dérivée.
IDENTITY_VALUE = 'identity_phrase'
Spécifie une expression relative à l'identité à partir de laquelle un GUID doit être généré pour baliser les données qui sont chiffrées à l'aide d'une clé temporaire.
PROVIDER_KEY_NAME = 'key_name_in_provider'
Spécifie le nom référencé dans le fournisseur EKM (Extensible Key Management).
Remarque
Cette option n'est pas disponible dans une base de données autonome.
CREATION_DISPOSITION = { CREATE_NEW | OPEN_EXISTING }
Crée ou mappe une clé symétrique à un appareil EKM (Extensible Key Management) existante.
CREATE_NEW
Crée une clé sur le périphérique EKM (Extensible Key Management). S'il existe déjà une clé sur l’appareil, l'instruction échoue et génère une erreur.
OPEN_EXISTING
Mappe une clé symétrique SQL Server à une clé EKM existante. Si la valeur
CREATION_DISPOSITION = OPEN_EXISTING
n’est pas fournie, elle prend la valeur par défautCREATE_NEW
.
certificate_name
Spécifie le nom du certificat qui est utilisé pour chiffrer la clé symétrique. Le certificat doit déjà exister dans la base de données.
'password'
Spécifie un mot de passe à partir duquel dériver une clé TRIPLE_DES avec laquelle sécuriser la clé symétrique. password doit satisfaire aux critères de la stratégie de mot de passe Windows de l’ordinateur qui exécute l’instance de SQL Server. Utilisez toujours des mots de passe forts.
symmetric_key_name
Spécifie une clé symétrique utilisée pour chiffrer la clé en cours de création. La clé spécifiée doit déjà exister dans la base de données et elle doit être ouverte.
asym_key_name
Spécifie une clé asymétrique utilisée pour chiffrer la clé en cours de création. Cette clé asymétrique doit déjà exister dans la base de données.
<algorithm>
Spécifiez l’algorithme de chiffrement.
Avertissement
À partir de SQL Server 2016 (13.x), tous les algorithmes autres que AES_128, AES_192 et AES_256 sont déconseillés. Pour utiliser des algorithmes plus anciens (ce qui n’est pas recommandé), vous devez affecter le niveau de compatibilité 120 ou un niveau inférieur à la base de données.
Notes
Lorsqu’une clé symétrique est créée, elle doit être chiffrée à l’aide d’au moins l’une des options suivantes :
- certificate
- mot de passe
- clé symétrique
- clé asymétrique
- FOURNISSEUR
La clé peut être soumise à plusieurs chiffrements de chaque type. En d'autres termes, une clé symétrique unique peut être chiffrée à l'aide de plusieurs certificats, mots de passe, clés symétriques et clés asymétriques à la fois.
Attention
Quand une clé symétrique est chiffrée avec un mot de passe au lieu d’un certificat (ou une autre clé), l’algorithme de chiffrement TRIPLE DES est utilisé pour chiffrer le mot de passe. Pour cette raison, les clés créées à l'aide d'un algorithme de chiffrement renforcé, tel qu'AES, sont elles-mêmes sécurisées par un algorithme plus faible.
Un mot de passe facultatif peut être utilisé pour chiffrer la clé symétrique avant de la distribuer à plusieurs utilisateurs.
Les clés temporaires appartiennent à l'utilisateur qui les crée. Les clés temporaires sont valides uniquement pour la session en cours.
IDENTITY_VALUE
génère un GUID qui permet de baliser les données chiffrées à l'aide de la nouvelle clé symétrique. Ce balisage peut être utilisé pour faire correspondre les clés aux données chiffrées. Le GUID généré par une expression spécifique est toujours le même. Lorsqu'une expression est utilisée pour générer un GUID, elle ne peut être réutilisée que si au moins une clé symétrique dans cette base de données l'utilise activement. IDENTITY_VALUE
est une clause facultative. Toutefois, nous vous conseillons de l'utiliser pour stocker des données chiffrées à l'aide d'une clé temporaire.
Il n'existe pas d'algorithme de chiffrement par défaut.
Important
Nous vous déconseillons d'utiliser les chiffrements de flux RC4 et RC4_128 pour protéger les données sensibles. SQL Server n’ajoute pas d’encodage supplémentaire au chiffrement effectué à l’aide de ces clés.
Des informations sur les clés symétriques sont consultables dans la vue de catalogue sys.symmetric_keys.
Les clés symétriques ne peuvent pas être chiffrées par les clés symétriques créées à partir du fournisseur de chiffrement.
Éclaircissement concernant les algorithmes DES
- DESX a été nommé incorrectement. Les clés symétriques créées avec ALGORITHM = DESX utilisent en fait le chiffrement TRIPLE DES avec une clé de 192 bits. L'algorithme DESX n'est pas fourni. Cette fonctionnalité sera supprimée dans une version future de SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement, et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.
- Les clés symétriques créées avec ALGORITHM = TRIPLE_DES_3KEY utilisent TRIPLE DES avec une clé de 192 bits.
- Les clés symétriques créées avec ALGORITHM = TRIPLE_DES utilisent TRIPLE DES avec une clé de 128 bits.
Dépréciation de l’algorithme RC4
L’utilisation répétée du même KEY_GUID RC4 ou RC4_128 sur différents blocs de données génère la même clé RC4 car SQL Server ne fournit pas automatiquement de salt. L'utilisation répétée de la même clé RC4 est une erreur connue qui entraîne un chiffrement très faible. Par conséquent, les mots clés RC4 et RC4_128 sont déconseillés. Cette fonctionnalité sera supprimée dans une version future de SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement, et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.
Avertissement
L'algorithme RC4 est uniquement pris en charge pour des raisons de compatibilité descendante. Le nouveau matériel ne peut être chiffré à l'aide de RC4 ou de RC4_128 que lorsque la base de données se trouve dans le niveau de compatibilité 90 ou 100. (Non recommandé.) Utilisez à la place un algorithme plus récent, tel qu'un des algorithmes AES. Dans SQL Server, le matériel chiffré à l'aide de RC4 ou de RC4_128 peut être déchiffré dans n'importe quel niveau de compatibilité.
Autorisations
Requiert l'autorisation ALTER ANY SYMMETRIC KEY sur la base de données. Si AUTHORIZATION
est spécifié, l'autorisation IMPERSONATE sur l'utilisateur de base de données ou l'autorisation ALTER sur le rôle d'application est requise. Si le chiffrement s'effectue par certificat ou clé asymétrique, l'autorisation VIEW DEFINITION est requise sur le certificat ou la clé asymétrique. Les connexions Windows, les connexions SQL Server et les rôles d'application sont les seuls à pouvoir posséder des clés symétriques. Les groupes et les rôles ne peuvent pas posséder de clés symétriques.
Exemples
R. Créer une clé symétrique
Dans l'exemple ci-dessous, une clé symétrique nommée JanainaKey09
est créée à l'aide de l'algorithme AES 256
, puis la nouvelle clé est chiffrée au moyen du certificat Shipping04
.
CREATE SYMMETRIC KEY JanainaKey09
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE Shipping04;
GO
B. Créer une clé symétrique temporaire
Dans l'exemple ci-dessous, une clé symétrique temporaire nommée #MarketingXXV
est créée à partir de la phrase secrète : The square of the hypotenuse is equal to the sum of the squares of the sides
. La clé obtient un GUID généré à partir de la chaîne Pythagoras
et est chiffrée à l'aide du certificat 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. Créer une clé symétrique à l'aide d'un appareil EKM (Extensible Key Management)
L'exemple suivant crée une clé symétrique appelée MySymKey
à l'aide d'un fournisseur appelé MyEKMProvider
et du nom de clé KeyForSensitiveData
. Il assigne l'autorisation à User1
et suppose que l'administrateur système a déjà inscrit le fournisseur appelé MyEKMProvider
dans SQL Server.
CREATE SYMMETRIC KEY MySymKey
AUTHORIZATION User1
FROM PROVIDER EKMProvider
WITH
PROVIDER_KEY_NAME='KeyForSensitiveData',
CREATION_DISPOSITION=OPEN_EXISTING;
GO