Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment chiffrer une procédure stockée dans SQL Server

Dans SQL Server, vous pouvez chiffrer une procédure stockée au moment où vous la créez, ou vous pouvez la modifier ultérieurement pour inclure le chiffrement.

Pour créer une procédure stockée avec T-SQL, vous utilisez le CREATE PROCEDURE syntaxe. Pour le chiffrer, vous ajoutez le WITH ENCRYPTION arguments.

Vous pouvez également utiliser le même argument pour chiffrer une procédure existante lors de l'utilisation de ALTER PROCEDURE .

Lorsque vous cryptez une procédure stockée de cette manière, le texte de la procédure est converti dans un format obscurci. Sa définition n'est pas directement visible dans les vues du catalogue. Par conséquent, la définition de la procédure ne peut pas être visualisée par les utilisateurs qui n'ont pas accès aux tables système ou aux fichiers de base de données.

Exemple 1 - Créer une procédure stockée chiffrée

Voici un exemple de création d'une procédure stockée chiffrée.

CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

GO

La partie pour le crypter est WITH ENCRYPTION . Je pourrais simplement supprimer cet argument si je ne voulais pas le chiffrer.

Exemple 2 - Afficher le résultat

Après avoir créé cette procédure, maintenant quand j'utilise le sp_helptext procédure stockée pour voir la définition de la procédure Je reçois un message m'indiquant qu'elle est chiffrée.

EXEC sp_helptext 'usp_GetCatsByName';

Résultat :

The text for object 'usp_GetCatsByName' is encrypted.

Et si j'utilise le sys.sql_modules vue du catalogue système, j'obtiens NULL.

SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');

Résultat :

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

J'obtiens un résultat similaire, quelle que soit la méthode T-SQL que j'utilise pour essayer d'obtenir la définition de la procédure.

Et voici le message d'erreur que j'obtiens dans Azure Data Studio lorsque j'essaie de scripter la procédure :

No script was returned when scripting as Create on object StoredProcedure

Et j'obtiendrais un message similaire si j'essayais de l'afficher dans SSMS, DBeaver ou tout autre logiciel de gestion de base de données GUI.

Exemple 3 – Ajouter un chiffrement à une procédure stockée existante

Si vous souhaitez chiffrer une procédure stockée existante, utilisez ALTER PROCEDURE avec la même définition. En d'autres termes, je peux prendre le premier exemple et remplacer CREATE avec ALTER .

ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

GO

Cela suppose évidemment que le reste de la définition de la procédure est exactement la même que celle existante.

Le moyen le plus simple de vous assurer que vous utilisez la même définition consiste à utiliser votre outil graphique pour créer un script de la procédure existante à l'aide de l'option "Script as Alter", si elle existe. Sinon, vous pouvez utiliser "Script as Create", puis lorsque la définition apparaît, modifiez CREATE avec ALTER .

Si vous n'avez qu'une interface de ligne de commande, vous pouvez interroger le sys.sql_modules view pour obtenir la définition existante (comme dans l'exemple précédent). Vous pouvez ensuite copier la définition et remplacer CREATE avec ALTER .

Une fois que vous avez fait cela, vous pouvez ajouter WITH ENCRYPTION et relancez-le.

Exemple 4 - Supprimer le chiffrement d'une procédure stockée

Nous pouvons supprimer le chiffrement en exécutant la ALTER PROCEDURE déclaration sans l'option de cryptage.

ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

Notez que ce n'est pas la même chose que de déchiffrer la procédure stockée. Ici, nous modifions simplement la procédure existante à la nouvelle définition. Il suppose donc que vous avez déjà une copie de la procédure existante quelque part dans votre contrôle de code source.

Exemple 5 – Procédures stockées compilées en mode natif

Le chiffrement n'est pas pris en charge sur les procédures stockées compilées en mode natif.

Voici ce qui se passe lorsque j'essaie de chiffrer une procédure stockée compilée en mode natif :

ALTER PROCEDURE [dbo].[usp_GetCowsByName] @cowname varchar(70)
WITH SCHEMABINDING, NATIVE_COMPILATION, ENCRYPTION
AS
BEGIN ATOMIC WITH (
    TRANSACTION ISOLATION LEVEL = SNAPSHOT, 
    LANGUAGE = N'us_english'
    )  
SELECT 
    CowId,
    CowName,
    Phone
FROM dbo.Cows
WHERE CowName = @cowname
END;

Résultat :

Msg 10794, Level 16, State 17, Procedure usp_GetCowsByName, Line 3
The option 'ENCRYPTION' is not supported with natively compiled modules.

Cet exemple de procédure est tiré de mon article, Comment créer une procédure stockée liée au schéma dans SQL Server, qui explique également que vous ne pouvez pas non plus lier au schéma une procédure stockée si ce n'est pas une procédure compilée en mode natif.

Remarques importantes

Voici quelques éléments à connaître sur le chiffrement des procédures stockées dans SQL Server :

  • Les utilisateurs privilégiés qui peuvent accéder aux tables système via le port DAC ou accéder directement aux fichiers de la base de données pourront toujours afficher la définition de la procédure stockée (non chiffrée).
  • Les utilisateurs qui peuvent attacher un débogueur au processus serveur peuvent récupérer la procédure d'origine de la mémoire lors de l'exécution.
  • L'utilisation du chiffrement empêche la publication de la procédure dans le cadre de la réplication SQL Server.
  • Les procédures CLR ne peuvent pas être chiffrées.
  • Les procédures compilées en mode natif ne peuvent pas être chiffrées.