Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come crittografare una stored procedure in SQL Server

In SQL Server puoi crittografare una stored procedure al momento della creazione oppure modificarla in un secondo momento per includere la crittografia.

Per creare una procedura memorizzata con T-SQL, si utilizza CREATE PROCEDURE sintassi. Per crittografarlo, aggiungi il WITH ENCRYPTION argomento.

Puoi anche usare lo stesso argomento per crittografare una procedura esistente quando usi ALTER PROCEDURE .

Quando si crittografa una procedura memorizzata in questo modo, il testo della procedura viene convertito in un formato offuscato. La sua definizione non è direttamente visibile in nessuna vista del catalogo. Pertanto, la definizione della procedura non può essere visualizzata da utenti che non hanno accesso a tabelle di sistema o file di database.

Esempio 1:creazione di una stored procedure crittografata

Ecco un esempio di creazione di una stored procedure crittografata.

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

GO

La parte per la crittografia è WITH ENCRYPTION . Potrei semplicemente rimuovere quell'argomento se non volessi crittografarlo.

Esempio 2 – Visualizza il risultato

Dopo aver creato quella procedura, ora utilizzo il sp_helptext stored procedure per visualizzare la definizione della procedura ricevo un messaggio che mi dice che è crittografata.

EXEC sp_helptext 'usp_GetCatsByName';

Risultato:

The text for object 'usp_GetCatsByName' is encrypted.

E se uso sys.sql_modules visualizzazione del catalogo di sistema ottengo NULL.

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

Risultato:

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

Ottengo un risultato simile, indipendentemente dal metodo T-SQL che utilizzo per cercare di ottenere la definizione della procedura.

Ed ecco il messaggio di errore che ricevo in Azure Data Studio quando provo a eseguire lo script della procedura:

No script was returned when scripting as Create on object StoredProcedure

E otterrei un messaggio simile se provassi a visualizzarlo in SSMS, DBeaver o qualsiasi altro software di gestione del database della GUI.

Esempio 3:aggiunta della crittografia a una stored procedure esistente

Se vuoi crittografare una stored procedure esistente, usa ALTER PROCEDURE con la stessa definizione. In altre parole, posso prendere il primo esempio e sostituire CREATE con ALTER .

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

GO

Questo ovviamente presuppone che il resto della definizione della procedura sia esattamente la stessa di quella esistente.

Il modo più semplice per assicurarsi di utilizzare la stessa definizione è utilizzare lo strumento GUI per eseguire lo script della procedura esistente utilizzando l'opzione "Script as Alter", se esiste. Altrimenti potresti usare "Script come Crea", quindi quando appare la definizione, cambia CREATE con ALTER .

Se hai solo un'interfaccia a riga di comando, puoi interrogare sys.sql_modules view per ottenere la definizione esistente (come nell'esempio precedente). Puoi quindi copiare la definizione e sostituire CREATE con ALTER .

Dopo averlo fatto, puoi aggiungere WITH ENCRYPTION ed eseguilo di nuovo.

Esempio 4:rimozione della crittografia da una stored procedure

Possiamo rimuovere la crittografia eseguendo ALTER PROCEDURE istruzione senza l'opzione di crittografia.

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

Si noti che questo non è lo stesso che decrittografare la procedura memorizzata. Qui stiamo semplicemente modificando la procedura esistente con la nuova definizione. Quindi presuppone che tu abbia già una copia della procedura esistente da qualche parte nel tuo controllo del codice sorgente.

Esempio 5:stored procedure compilate in modo nativo

La crittografia non è supportata nelle stored procedure compilate in modo nativo.

Ecco cosa succede quando provo a crittografare una stored procedure compilata in modo nativo:

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;

Risultato:

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

Tale procedura di esempio è tratta dal mio articolo, Come creare una stored procedure associata a uno schema in SQL Server, in cui viene spiegato anche che non è possibile collegare allo schema una stored procedure se non è una procedura compilata in modo nativo.

Note importanti

Ecco alcune cose che dovresti sapere sulla crittografia delle stored procedure in SQL Server:

  • Gli utenti privilegiati che possono accedere alle tabelle di sistema tramite la porta DAC o accedere direttamente ai file del database potranno comunque visualizzare la definizione della procedura memorizzata (non crittografata).
  • Gli utenti che possono collegare un debugger al processo del server possono recuperare la procedura originale dalla memoria in fase di esecuzione.
  • L'uso della crittografia impedisce la pubblicazione della procedura come parte della replica di SQL Server.
  • Le procedure CLR non possono essere crittografate.
  • Le procedure compilate in modo nativo non possono essere crittografate.