Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como criptografar um procedimento armazenado no SQL Server


No SQL Server, você pode criptografar um procedimento armazenado no momento em que o cria ou pode alterá-lo posteriormente para incluir a criptografia.

Para criar um procedimento armazenado com T-SQL, você usa o CREATE PROCEDURE sintaxe. Para criptografá-lo, você adiciona o WITH ENCRYPTION argumento.

Você também pode usar o mesmo argumento para criptografar um procedimento existente ao usar ALTER PROCEDURE .



Quando você criptografa um procedimento armazenado dessa maneira, o texto do procedimento é convertido em um formato ofuscado. Sua definição não é diretamente visível em nenhuma exibição de catálogo. Portanto, a definição do procedimento não pode ser visualizada por usuários que não tenham acesso às tabelas do sistema ou aos arquivos do banco de dados.

Exemplo 1 – Criar um procedimento armazenado criptografado


Aqui está um exemplo de criação de um procedimento armazenado criptografado.
CREATE PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

GO

A parte para criptografar é WITH ENCRYPTION . Eu poderia simplesmente remover esse argumento se não quisesse criptografá-lo.

Exemplo 2 – Veja o resultado


Depois de criar esse procedimento, agora quando uso o sp_helptext procedimento armazenado para visualizar a definição do procedimento, recebo uma mensagem informando que ele está criptografado.
EXEC sp_helptext 'usp_GetCatsByName';

Resultado:
The text for object 'usp_GetCatsByName' is encrypted.

E se eu usar o sys.sql_modules visualização do catálogo do sistema recebo NULL.
SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('dbo.usp_GetCatsByName');

Resultado:
+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

Obtenho um resultado semelhante, independentemente de qual método T-SQL eu uso para tentar obter a definição do procedimento.

E aqui está a mensagem de erro que recebo no Azure Data Studio quando tento fazer o script do procedimento:
No script was returned when scripting as Create on object StoredProcedure

E eu receberia uma mensagem semelhante se tentasse visualizá-la no SSMS, DBeaver ou qualquer outro software de gerenciamento de banco de dados GUI.

Exemplo 3 - Adicionar criptografia a um procedimento armazenado existente


Se você deseja criptografar um procedimento armazenado existente, use ALTER PROCEDURE com a mesma definição. Em outras palavras, posso pegar o primeiro exemplo e substituir CREATE com ALTER .
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
WITH ENCRYPTION
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

GO

Isso obviamente pressupõe que o restante da definição do procedimento é exatamente a mesma que a existente.

A maneira mais fácil de garantir que você está usando a mesma definição é usar sua ferramenta GUI para fazer o script do procedimento existente usando a opção “Script as Alter”, se existir. Caso contrário, você pode usar “Script as Create” e, quando a definição aparecer, altere CREATE com ALTER .

Se você tiver apenas uma interface de linha de comando, poderá consultar o sys.sql_modules view para obter a definição existente (como no exemplo anterior). Você pode então copiar a definição e substituir CREATE com ALTER .

Depois de fazer isso, você pode adicionar WITH ENCRYPTION e execute-o novamente.

Exemplo 4 – Remover criptografia de um procedimento armazenado


Podemos remover a criptografia executando o ALTER PROCEDURE declaração sem a opção de criptografia.
ALTER PROCEDURE dbo.usp_GetCatsByName @catname varchar(70)
AS
SELECT 
    CatId,
    CatName,
    Phone
FROM dbo.Cats
WHERE CatName = @catname;

Observe que isso não é o mesmo que descriptografar o procedimento armazenado. Aqui, estamos simplesmente alterando o procedimento existente para a nova definição. Portanto, ele pressupõe que você já tenha uma cópia do procedimento existente em algum lugar do seu controle de origem.

Exemplo 5 – Procedimentos armazenados compilados nativamente


A criptografia não é compatível com procedimentos armazenados compilados nativamente.

Aqui está o que acontece quando tento criptografar um procedimento armazenado compilado nativamente:
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;

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

Esse procedimento de exemplo é retirado do meu artigo, Como criar um procedimento armazenado vinculado ao esquema no SQL Server, que também explica que você também não pode vincular um procedimento armazenado ao esquema se não for um procedimento compilado nativamente.

Observações importantes


Aqui estão algumas coisas que você deve saber sobre a criptografia de procedimentos armazenados no SQL Server:
  • Usuários privilegiados que podem acessar as tabelas do sistema pela porta DAC ou acessar diretamente os arquivos de banco de dados ainda poderão visualizar a definição do procedimento armazenado (não criptografado).
  • Os usuários que podem anexar um depurador ao processo do servidor podem recuperar o procedimento original da memória em tempo de execução.
  • O uso de criptografia impede que o procedimento seja publicado como parte da replicação do SQL Server.
  • Os procedimentos CLR não podem ser criptografados.
  • Procedimentos compilados nativamente não podem ser criptografados.