Partilhar via


DECRYPTBYKEY (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do AzureBanco de Dados SQL do Azure Synapse Analyticsno Microsoft Fabric

Esta função usa uma chave simétrica para desencriptar dados.

Transact-SQL convenções de sintaxe

Observação

Essa sintaxe não é suportada pelo pool SQL sem servidor no Azure Synapse Analytics. Para pools SQL dedicados no Azure Synapse Analytics, o cache do conjunto de resultados não deve ser usado com DECRYPTBYKEYo . Se essa função criptográfica precisar ser usada, verifique se o cache do conjunto de resultados está desabilitado (no nível da sessão ou do banco de dados) no momento da execução.

Sintaxe

DECRYPTBYKEY ( { 'ciphertext' | @ciphertext }
    [ , add_authenticator , { authenticator | @authenticator } ] )

Arguments

texto cifrado

Uma variável do tipo varbinary contendo dados criptografados com a chave.

@ciphertext

Uma variável do tipo varbinary contendo dados criptografados com a chave.

add_authenticator

Indica se o processo de criptografia original incluiu e criptografou um autenticador junto com o texto sem formatação. Deve corresponder ao valor passado para ENCRYPTBYKEY durante o processo de criptografia de dados. add_authenticator tem um tipo de dados int .

autenticador

Os dados utilizados como base para a geração do autenticador. Deve corresponder ao valor fornecido a ENCRYPTBYKEY. autenticador é sysname.

@authenticator

Uma variável que contém dados a partir dos quais um autenticador gera. Deve corresponder ao valor fornecido a ENCRYPTBYKEY. @authenticator é sysname.

Tipos de devolução

varbinary, com um tamanho máximo de 8.000 bytes. DECRYPTBYKEY retorna NULL se a chave simétrica usada para criptografia de dados não estiver aberta ou se o texto cifrado for NULL.

Observações

DECRYPTBYKEY usa uma chave simétrica. O banco de dados deve ter essa chave simétrica já aberta. DECRYPTBYKEY Permite que várias teclas sejam abertas ao mesmo tempo. Não é necessário abrir a chave imediatamente antes da desencriptação do texto cifrado.

A encriptação simétrica e a desencriptação normalmente operam rapidamente e funcionam bem para operações que envolvem grandes volumes de dados.

A DECRYPTBYKEY chamada deve acontecer no contexto do banco de dados que contém a chave de criptografia. Certifique-se disso chamando DECRYPTBYKEY de um objeto (como um modo de exibição, procedimento armazenado ou função) que reside no banco de dados.

Permissions

A chave simétrica já deve estar aberta na sessão atual. Para obter mais informações, consulte OPEN SYMMETRIC KEY.

Examples

A. Desencriptar usando uma chave simétrica

Este exemplo descriptografa texto cifrado com uma chave simétrica.

-- First, open the symmetric key with which to decrypt the data.
OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE HumanResources037;
GO

-- Now list the original ID, the encrypted ID, and the
-- decrypted ciphertext. If the decryption worked, the original
-- and the decrypted ID will match.
SELECT NationalIDNumber,
       EncryptedNationalID AS 'Encrypted ID Number',
       CONVERT (NVARCHAR, DECRYPTBYKEY(EncryptedNationalID)) AS 'Decrypted ID Number'
FROM HumanResources.Employee;
GO

B. Desencriptar usando uma chave simétrica e um hash de autenticação

Este exemplo descriptografa dados originalmente criptografados junto com um autenticador.

-- First, open the symmetric key with which to decrypt the data
OPEN SYMMETRIC KEY CreditCards_Key11 DECRYPTION BY CERTIFICATE Sales09;
GO

-- Now list the original card number, the encrypted card number,
-- and the decrypted ciphertext. If the decryption worked,
-- the original number will match the decrypted number.
SELECT CardNumber,
       CardNumber_Encrypted AS 'Encrypted card number',
       CONVERT (NVARCHAR, DECRYPTBYKEY(CardNumber_Encrypted, 1, HashBytes('SHA1', CONVERT (VARBINARY, CreditCardID)))) AS 'Decrypted card number'
FROM Sales.CreditCard;

C. Falha ao desencriptar quando não está no contexto da base de dados com chave

O exemplo a seguir demonstra que DECRYPTBYKEY deve ser executado no contexto do banco de dados que contém a chave. A linha não é descriptografada quando DECRYPTBYKEY é executada master no banco de dados, o resultado é NULL.

-- Create the database
CREATE DATABASE TestingDecryptByKey;
GO

USE [TestingDecryptByKey]; -- Create the table and view

CREATE TABLE TestingDecryptByKey.dbo.Test (val VARBINARY (8000) NOT NULL);
GO

CREATE VIEW dbo.TestView AS
    SELECT CAST (DECRYPTBYKEY(val) AS VARCHAR (30)) AS DecryptedVal
    FROM TestingDecryptByKey.dbo.Test;
GO

-- Create the key, and certificate
USE TestingDecryptByKey;

CREATE MASTER KEY ENCRYPTION BY PASSWORD= 'ItIsreallyLong1AndSecured!Password#';

CREATE CERTIFICATE TestEncryptionCertificate
    WITH SUBJECT = 'TestEncryption';

CREATE SYMMETRIC KEY TestEncryptSymmetricKey
    WITH ALGORITHM = AES_256, IDENTITY_VALUE = 'It is place for test', KEY_SOURCE = 'It is source for test'
    ENCRYPTION BY CERTIFICATE TestEncryptionCertificate;

-- Insert rows into the table
DECLARE @var AS VARBINARY (8000), @Val AS VARCHAR (30);
SELECT @Val = '000-123-4567';

OPEN SYMMETRIC KEY TestEncryptSymmetricKey DECRYPTION BY CERTIFICATE TestEncryptionCertificate;

SELECT @var = EncryptByKey(Key_GUID('TestEncryptSymmetricKey'), @Val);

SELECT CAST (DECRYPTBYKEY(@var) AS VARCHAR (30)),
       @Val;

INSERT INTO dbo.Test
VALUES (@var);
GO

-- Switch to master
USE [master];
GO

-- Results show the date inserted
SELECT DecryptedVal
FROM TestingDecryptByKey.dbo.TestView;

-- Results are NULL because we are not in the context of the TestingDecryptByKey Database
SELECT CAST (DECRYPTBYKEY(val) AS VARCHAR (30)) AS DecryptedVal
FROM TestingDecryptByKey.dbo.Test;
GO

-- Clean up resources
USE TestingDecryptByKey;

DROP SYMMETRIC KEY TestEncryptSymmetricKey REMOVE PROVIDER KEY;
DROP CERTIFICATE TestEncryptionCertificate;

USE [master];

DROP DATABASE TestingDecryptByKey;
GO