Udostępnij za pomocą


DECRYPTBYKEY (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSQL database w usłudze Microsoft Fabric

Ta funkcja używa klucza symetrycznego do odszyfrowywania danych.

Transact-SQL konwencje składni

Uwaga / Notatka

Ta składnia nie jest obsługiwana przez bezserwerową pulę SQL w usłudze Azure Synapse Analytics. W przypadku dedykowanych pul SQL w usłudze Azure Synapse Analytics buforowanie zestawu wyników nie powinno być używane z usługą DECRYPTBYKEY. Jeśli ta funkcja kryptograficzna musi być używana, upewnij się, że buforowanie zestawu wyników jest wyłączone (na poziomie sesji lub na poziomie bazy danych) w czasie wykonywania.

Składnia

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

Arguments

szyfrogram

Zmienna typu varbinary zawierająca dane zaszyfrowane za pomocą klucza.

@ciphertext

Zmienna typu varbinary zawierająca dane zaszyfrowane za pomocą klucza.

add_authenticator

Wskazuje, czy oryginalny proces szyfrowania zawiera i zaszyfrowany moduł uwierzytelniania wraz z zwykły tekst. Musi być zgodna z wartością przekazaną do funkcji ENCRYPTBYKEY podczas procesu szyfrowania danych. add_authenticator ma typ danych int .

Wystawca uwierzytelnienia

Dane używane jako podstawa generowania wystawcy uwierzytelnienia. Musi być zgodna z wartością podaną w parametrze ENCRYPTBYKEY. Authenticator to nazwa systemu.

@authenticator

Zmienna zawierająca dane, z których generuje wystawca uwierzytelnienia. Musi być zgodna z wartością podaną w parametrze ENCRYPTBYKEY. @authenticator jest nazwą systemu.

Typy zwracane

varbinary o maksymalnym rozmiarze 8000 bajtów. DECRYPTBYKEY Zwraca NULL wartość , jeśli klucz symetryczny używany do szyfrowania danych nie jest otwarty lub jeśli tekst szyfrowania to NULL.

Uwagi

DECRYPTBYKEY używa klucza symetrycznego. Baza danych musi mieć już otwarty ten klucz symetryczny. DECRYPTBYKEY umożliwia otwieranie wielu kluczy w tym samym czasie. Nie musisz otwierać klucza bezpośrednio przed odszyfrowywaniem tekstu szyfrującego.

Szyfrowanie symetryczne i odszyfrowywanie zwykle działają szybko i działają dobrze w przypadku operacji obejmujących duże ilości danych.

Wywołanie DECRYPTBYKEY musi nastąpić w kontekście bazy danych zawierającej klucz szyfrowania. Upewnij się, że jest to wywoływane DECRYPTBYKEY z obiektu (takiego jak widok, procedura składowana lub funkcja) znajdującego się w bazie danych.

Permissions

Klucz symetryczny musi być już otwarty w bieżącej sesji. Aby uzyskać więcej informacji, zobacz OPEN SYMMETRIC KEY (OTWÓRZ KLUCZ SYMETRYCZNY).

Przykłady

A. Odszyfrowywanie przy użyciu klucza symetrycznego

W tym przykładzie odszyfrowuje tekst szyfrujący przy użyciu klucza symetrycznego.

-- 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. Odszyfrowywanie przy użyciu klucza symetrycznego i uwierzytelniania skrótu

Ten przykład odszyfrowuje dane pierwotnie zaszyfrowane razem z wystawcą uwierzytelniania.

-- 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. Nie można odszyfrować, gdy nie jest w kontekście bazy danych z kluczem

W poniższym przykładzie pokazano, że DECRYPTBYKEY należy wykonać je w kontekście bazy danych zawierającej klucz. Wiersz nie jest odszyfrowywane, gdy DECRYPTBYKEY jest wykonywany w master bazie danych; wynikiem jest 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