Come faccio a sapere quale algoritmo di hashing utilizzato da SQL Server per decrittografare i dati crittografati quando si utilizza la funzione DECRYPTBYPASSPHRASE?


12

La mia domanda è collegata al seguente esperimento con due casi:

Istanza di SQL Server 2017 Express (Microsoft SQL Server 2017 (RTM-CU16)) Istanza di
SQL Server 2014 Express (Microsoft SQL Server 2014 (SP2-CU18))

Ho usato la funzione ENCRYPTBYPASSPHRASE per crittografare un testo e ho usato il risultato come @ciphertext per DECRYPTBYPASSPHRASE . Il risultato dei miei test sono stati questi:

Tabella dei risultati

Secondo questa correzione Microsoft ,

[...] SQL Server 2017 utilizza l'algoritmo di hashing SHA2 per eseguire l'hashing della passphrase. SQL Server 2016 e versioni precedenti di SQL Server utilizzano l'algoritmo SHA1 che non è più considerato sicuro.

Ma come fa a sapere qual è stato l'algoritmo utilizzato per crittografare i dati se non vi è alcun argomento correlato a quello sulla funzione DECRYPTBYPASSPHRASE? Fa parte dei dati crittografati?

In base ai risultati dei miei test, suppongo che SQL Server utilizzi sempre la versione più recente dell'algoritmo disponibile sull'istanza per crittografare i dati, ma prova tutti gli algoritmi a decrittografare i dati fino a quando non ne trova uno che si adatta o restituisce NULL quando non viene trovato alcun algoritmo corrispondente . È solo un'ipotesi, dal momento che non sono riuscito a trovare alcun modo per verificare quale algoritmo di hashing SQL Server ha utilizzato per decrittografare i dati crittografati.

Risposte:


14

Ma come fa a sapere qual è stato l'algoritmo utilizzato per crittografare i dati se non vi è alcun argomento correlato a quello sulla funzione DECRYPTBYPASSPHRASE? Fa parte dei dati crittografati?

Sì, proprio sul punto.

Userò quanto segue per l'output:

DECLARE @Data VARBINARY(MAX)
DECLARE @Text NVARCHAR(MAX) = N'I''ll get you, and your little dog too!'
DECLARE @Phrase NVARCHAR(100) = N'Fly My Pretties!'

SELECT @Data = ENCRYPTBYPASSPHRASE(@Phrase, @Text)

SELECT @Data AS [Encrypted_Data]

SELECT CAST(DECRYPTBYPASSPHRASE(@Phrase, @Data) AS NVARCHAR(MAX))

Se eseguo questo sulla mia istanza 2014, otterrò quanto segue per Encrypted_Data: 0x01000000E565142762F62...

Se eseguo questo sulla mia istanza 2017, otterrò quanto segue per Encrypted_Data: 0x020000004D261C666204F...

Quello che dovrebbe apparire è il preambolo, dove puoi vedere l'istanza 2014 inizia con 0x01e l'istanza 2017 inizia con 0x02. Questo è il controllo delle versioni del tipo di crittografia utilizzato. Nota che non c'è solo questo, ma non è necessario entrare nei dettagli ai fini di questa risposta, né deve essere di dominio pubblico.

SQL Server 2017 comprende 0x01e 0x02perché è nuovo e conosce le novità. SQL Server 2014 comprende solo 0x01perché è più vecchio e non conosce nessuna delle novità poiché le nuove cose non sono state importate.

[...] SQL Server 2017 utilizza l'algoritmo di hashing SHA2 per eseguire l'hashing della passphrase. SQL Server 2016 e versioni precedenti di SQL Server utilizzano l'algoritmo SHA1 che non è più considerato sicuro.

Questa non è la stessa cosa, ma generalmente ha a che fare con le chiavi simmetriche create con lo stesso vettore di inizializzazione in entrambe le versioni. Ho scritto un blog su questo quando è uscito il 2017 ed è stato corretto un po 'più tardi con il flag di traccia che deve essere usato mentre nella tua domanda non è necessario alcun flag di traccia per il 2017 per leggere i dati del 2014 come mostrato.


Ciao Sean. Potresti fornire informazioni più dettagliate sulla bandiera di traccia dalla tua risposta?
Konstantin Taranov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.