Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
Azure Synapse Analytics
Database SQL in Microsoft Fabric
Questa funzione usa una chiave simmetrica per decrittografare i dati.
Convenzioni relative alla sintassi Transact-SQL
Nota
Questa sintassi non è supportata da pool SQL serverless in Azure Synapse Analytics. Per i pool SQL dedicati in Azure Synapse Analytics, la memorizzazione nella cache dei set di risultati non deve essere usata con DECRYPTBYKEY. Se questa funzione di crittografia deve essere usata, assicurarsi di avere disabilitato la memorizzazione nella cache dei set di risultati (a livello di sessione o a livello di database) al momento dell'esecuzione.
Sintassi
DECRYPTBYKEY ( { 'ciphertext' | @ciphertext }
[ , add_authenticator , { authenticator | @authenticator } ] )
Argomenti
ciphertext
Variabile di tipo varbinary contenente dati crittografati con la chiave.
@ciphertext
Variabile di tipo varbinary contenente dati crittografati con la chiave.
add_authenticator
Indica se il processo di crittografia originale includeva e crittografava un autenticatore insieme al testo non crittografato. Deve corrispondere al valore passato a ENCRYPTBYKEY durante il processo di crittografia dei dati. add_authenticator ha un tipo di dati int.
authenticator
Dati usati come base per la generazione dell'autenticatore. Deve corrispondere al valore fornito a ENCRYPTBYKEY. authenticator è sysname.
@authenticator
Variabile contenente i dati dai quali derivare un autenticatore. Deve corrispondere al valore fornito a ENCRYPTBYKEY. @authenticator è sysname.
Tipi restituiti
varbinary con un valore massimo di 8.000 byte.
DECRYPTBYKEY restituisce NULL se la chiave simmetrica usata per la crittografia dei dati non è aperta o se il testo crittografato è NULL.
Osservazioni:
DECRYPTBYKEY usa una chiave simmetrica. Il database deve avere la chiave simmetrica già aperta.
DECRYPTBYKEY consente l'apertura di più chiavi contemporaneamente. Non è necessario aprire la chiave immediatamente prima della decrittografia del testo crittografato.
La crittografia simmetrica e la decrittografia funzionano in genere rapidamente e funzionano bene per le operazioni che coinvolgono volumi di dati di grandi dimensioni.
La chiamata a DECRYPTBYKEY deve essere eseguita nel contesto del database contenente la chiave di crittografia. Assicurarsi che ciò avvenga chiamando DECRYPTBYKEY da un oggetto (ad esempio una vista, una stored procedure o una funzione) che si trovi nel database.
Autorizzazioni
La chiave simmetrica deve essere già aperta nella sessione corrente. Per altre informazioni, vedere OPEN SYMMETRIC KEY.
Esempi
R. Decrittografare usando una chiave simmetrica
In questo esempio viene decrittografato il testo crittografato con una chiave simmetrica.
-- 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. Decrittografare usando una chiave simmetrica e un hash di autenticazione
In questo esempio vengono decrittografati i dati originariamente crittografati insieme a un autenticatore.
-- 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. Non è possibile eseguire la decrittografia al di fuori del contesto del database con la chiave
L'esempio seguente illustra che è necessario eseguire DECRYPTBYKEY nel contesto del database che contiene la chiave. La riga non viene decrittografata quando DECRYPTBYKEY viene eseguita nel master database. Il risultato è 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