Delen via


DECRYPTBYKEY (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Deze functie gebruikt een symmetrische sleutel om gegevens te ontsleutelen.

Transact-SQL syntaxis-conventies

Opmerking

Deze syntaxis wordt niet ondersteund door een serverloze SQL-pool in Azure Synapse Analytics. Voor toegewezen SQL-pools in Azure Synapse Analytics mag de cache van resultatensets niet worden gebruikt met DECRYPTBYKEY. Als deze cryptografische functie moet worden gebruikt, moet u ervoor zorgen dat de resultatenset caching is uitgeschakeld (op sessieniveau of op databaseniveau) op het moment van uitvoering.

Syntaxis

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

Arguments

coderingstekst

Een variabele van het type varbinary die gegevens bevat die zijn versleuteld met de sleutel.

@ciphertext

Een variabele van het type varbinary die gegevens bevat die zijn versleuteld met de sleutel.

add_authenticator

Geeft aan of het oorspronkelijke versleutelingsproces is opgenomen en versleuteld, een verificator samen met de tekst zonder opmaak. Moet overeenkomen met de waarde die is doorgegeven aan ENCRYPTBYKEY tijdens het gegevensversleutelingsproces. add_authenticator heeft een gegevenstype int .

Verificator

De gegevens die worden gebruikt als basis voor het genereren van de verificator. Moet overeenkomen met de waarde die is opgegeven aan ENCRYPTBYKEY. authenticator is sysname.

@authenticator

Een variabele met gegevens waaruit een verificator genereert. Moet overeenkomen met de waarde die is opgegeven aan ENCRYPTBYKEY. @authenticator is sysname.

Retourtypen

varbinary, met een maximale grootte van 8.000 bytes. DECRYPTBYKEY retourneert NULL als de symmetrische sleutel die wordt gebruikt voor gegevensversleuteling niet is geopend of als coderingstekst is NULL.

Opmerkingen

DECRYPTBYKEY maakt gebruik van een symmetrische sleutel. De database moet deze symmetrische sleutel al hebben geopend. DECRYPTBYKEY staat meerdere sleutels tegelijk toe. U hoeft de sleutel niet direct te openen voordat de codering van tekst wordt ontsleuteld.

Symmetrische versleuteling en ontsleuteling werken doorgaans snel en ze werken goed voor bewerkingen met grote gegevensvolumes.

De DECRYPTBYKEY aanroep moet plaatsvinden in de context van de database met de versleutelingssleutel. Zorg ervoor dat dit gebeurt door aan te roepen DECRYPTBYKEY vanuit een object (zoals een weergave of opgeslagen procedure of functie) die zich in de database bevindt.

Permissions

De symmetrische sleutel moet al zijn geopend in de huidige sessie. Zie OPEN SYMMETRIC KEY voor meer informatie.

Voorbeelden

Eén. Ontsleutelen met behulp van een symmetrische sleutel

In dit voorbeeld wordt coderingstekst ontsleuteld met een symmetrische sleutel.

-- 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. Ontsleutelen met behulp van een symmetrische sleutel en een verificatie-hash

In dit voorbeeld worden gegevens ontsleuteld die oorspronkelijk zijn versleuteld met een verificator.

-- 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. Kan niet ontsleutelen wanneer deze zich niet in de context van de database bevindt met de sleutel

In het volgende voorbeeld ziet u dat DECRYPTBYKEY moet worden uitgevoerd in de context van de database die de sleutel bevat. De rij wordt niet ontsleuteld wanneer DECRYPTBYKEY deze wordt uitgevoerd in de master database. Het resultaat is 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