Bagaimana saya bisa tahu algoritma hashing apa SQL Server digunakan untuk mendekripsi data terenkripsi saat menggunakan fungsi DECRYPTBYPASSPHRASE?

12

Pertanyaan saya terkait dengan percobaan berikut dengan dua contoh:

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

Saya menggunakan fungsi ENCRYPTBYPASSPHRASE untuk mengenkripsi teks dan menggunakan hasilnya sebagai @ciphertext untuk DECRYPTBYPASSPHRASE . Hasil tes saya adalah ini:

Daftar hasil

Menurut perbaikan Microsoft ini ,

[...] SQL Server 2017 menggunakan algoritma hashing SHA2 untuk hash frasa sandi. SQL Server 2016 dan versi SQL Server sebelumnya menggunakan algoritma SHA1 yang tidak lagi dianggap aman.

Tetapi bagaimana ia tahu apa algoritma yang digunakan untuk mengenkripsi data jika tidak ada argumen yang terkait dengan itu pada fungsi DECRYPTBYPASSPHRASE? Apakah itu bagian dari data terenkripsi?

Dengan hasil pengujian saya, saya kira SQL Server selalu menggunakan versi terbaru dari algoritma yang tersedia pada contoh untuk mengenkripsi data, tetapi mencoba semua algoritma untuk mendekripsi data sampai menemukan satu yang cocok atau mengembalikan NULL ketika tidak ada algoritma yang sesuai ditemukan . Tapi ini hanya dugaan karena saya tidak dapat menemukan cara untuk memeriksa algoritma hashing apa yang digunakan SQL Server untuk mendekripsi data terenkripsi.

Ronaldo
sumber

Jawaban:

14

Tetapi bagaimana ia tahu apa algoritma yang digunakan untuk mengenkripsi data jika tidak ada argumen yang terkait dengan itu pada fungsi DECRYPTBYPASSPHRASE? Apakah itu bagian dari data terenkripsi?

Ya, benar.

Saya akan menggunakan yang berikut untuk 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))

Jika saya menjalankan ini pada instance 2014 saya, saya akan mendapatkan yang berikut untuk Encrypted_Data: 0x01000000E565142762F62...

Jika saya menjalankan ini pada instance 2017 saya, saya akan mendapatkan yang berikut untuk Encrypted_Data: 0x020000004D261C666204F...

Apa yang seharusnya muncul adalah pembukaan, di mana Anda dapat melihat instance 2014 dimulai dengan 0x01dan instance 2017 dimulai dengan 0x02. Ini adalah versi jenis enkripsi yang digunakan. Perhatikan bahwa ada lebih dari sekedar ini tetapi tidak perlu masuk ke detail itu untuk keperluan jawaban ini, juga tidak perlu menjadi pengetahuan umum.

SQL Server 2017 mengerti 0x01dan 0x02karena ini baru dan mengetahui hal-hal baru. SQL Server 2014 mengerti hanya 0x01karena lebih tua dan tidak mengetahui hal-hal baru karena hal-hal baru tidak di-backport.

[...] SQL Server 2017 menggunakan algoritma hashing SHA2 untuk hash frasa sandi. SQL Server 2016 dan versi SQL Server sebelumnya menggunakan algoritma SHA1 yang tidak lagi dianggap aman.

Ini bukan hal yang sama, tetapi umumnya harus dilakukan dengan kunci Symmetric yang dibuat dengan vektor inisialisasi yang sama di kedua versi. Saya membuat blog tentang ini ketika 2017 keluar dan diperbaiki sedikit kemudian dengan bendera jejak yang harus digunakan sedangkan dalam pertanyaan Anda tidak ada bendera jejak yang diperlukan untuk 2017 untuk membaca data 2014 seperti yang ditunjukkan.

Sean Gallardy
sumber
Hai, Sean. Bisakah Anda memberikan informasi lebih rinci tentang tanda jejak dari jawaban Anda?
Konstantin Taranov