Header konteks di ASP.NET Core
Latar belakang dan teori
Dalam sistem perlindungan data, "kunci" berarti objek yang dapat menyediakan layanan enkripsi terautentikasi. Setiap kunci diidentifikasi oleh id unik (GUID), dan membawa informasi algoritma dan materi entropis. Ini dimaksudkan bahwa setiap kunci membawa entropi unik, tetapi sistem tidak dapat memberlakukan itu, dan kita juga perlu memperhitungkan pengembang yang mungkin mengubah cincin kunci secara manual dengan memodifikasi informasi algoritma dari kunci yang ada di cincin kunci. Untuk mencapai persyaratan keamanan kami mengingat kasus-kasus ini, sistem perlindungan data memiliki konsep kelincahan kriptografi, yang memungkinkan penggunaan nilai entropik tunggal dengan aman di beberapa algoritma kriptografi.
Sebagian besar sistem yang mendukung kelincahan kriptografi melakukannya dengan menyertakan beberapa informasi identifikasi tentang algoritma di dalam payload. OID algoritma umumnya merupakan kandidat yang baik untuk ini. Namun, salah satu masalah yang kami alami adalah ada beberapa cara untuk menentukan algoritma yang sama: kelas "AES" (CNG) dan Aes terkelola, AesManaged, AesCryptoServiceProvider, AesCng, dan RijndaelManaged (parameter tertentu tertentu) semuanya sebenarnya hal yang sama, dan kita perlu mempertahankan pemetaan semua ini ke OID yang benar. Jika pengembang ingin memberikan algoritma kustom (atau bahkan implementasi AES lain!), mereka harus memberi tahu kami OID-nya. Langkah pendaftaran tambahan ini membuat konfigurasi sistem sangat menyakitkan.
Mundur, kami memutuskan bahwa kami mendekati masalah dari arah yang salah. OID memberi tahu Anda apa algoritmanya, tetapi kami tidak benar-benar peduli tentang hal ini. Jika kita perlu menggunakan satu nilai entropis dengan aman dalam dua algoritma yang berbeda, tidak perlu bagi kita untuk mengetahui apa algoritma sebenarnya. Apa yang sebenarnya kita pedulikan adalah bagaimana perilaku mereka. Setiap algoritma sandi blok simetris yang layak juga merupakan permutasi pseudorandom yang kuat (PRP): memperbaiki input (kunci, mode rantai, IV, teks biasa) dan output ciphertext akan dengan probabilitas yang luar biasa berbeda dari algoritma sandi blok simetris lainnya yang diberikan input yang sama. Demikian pula, fungsi hash kunci yang layak juga merupakan fungsi pseudorandom (PRF) yang kuat, dan mengingat set input tetap outputnya akan sangat berbeda dari fungsi hash kunci lainnya.
Kami menggunakan konsep PRD dan PDF yang kuat ini untuk membangun header konteks. Header konteks ini pada dasarnya bertindak sebagai thumbprint yang stabil atas algoritma yang digunakan untuk operasi tertentu, dan memberikan kelincahan kriptografi yang diperlukan oleh sistem perlindungan data. Header ini dapat direproduksi dan digunakan nanti sebagai bagian dari proses derivasi subkunci. Ada dua cara berbeda untuk membangun header konteks tergantung pada mode operasi algoritma yang mendasar.
Enkripsi mode CBC + autentikasi HMAC
Header konteks terdiri dari komponen berikut:
[16 bit] Nilai 00 00, yang merupakan penanda yang berarti "enkripsi CBC + autentikasi HMAC".
[32 bit] Panjang kunci (dalam byte, big-endian) dari algoritma sandi blok simetris.
[32 bit] Ukuran blok (dalam byte, big-endian) dari algoritma sandi blok simetris.
[32 bit] Panjang kunci (dalam byte, big-endian) dari algoritma HMAC. (Saat ini ukuran kunci selalu cocok dengan ukuran hash.)
[32 bit] Ukuran hash (dalam byte, big-endian) dari algoritma HMAC.
EncCBC(K_E, IV, "")
, yang merupakan output dari algoritma cipher blok simetris yang diberikan input string kosong dan di mana IV adalah vektor all-zero. KonstruksiK_E
dijelaskan di bawah ini.MAC(K_H, "")
, yang merupakan output dari algoritma HMAC yang diberi input string kosong. KonstruksiK_H
dijelaskan di bawah ini.
Idealnya, kita bisa melewati semua vektor nol untuk K_E
dan K_H
. Namun, kami ingin menghindari situasi di mana algoritma yang mendasarinya memeriksa keberadaan kunci yang lemah sebelum melakukan operasi apa pun (terutama DES dan 3DES), yang menghalangi penggunaan pola sederhana atau berulang seperti vektor all-zero.
Sebagai gantinya, kami menggunakan NIST SP800-108 KDF dalam Mode Penghitung (lihat NIST SP800-108, Sec. 5.1) dengan kunci, label, dan konteks panjang nol dan HMACSHA512 sebagai PRF yang mendasar. Kami memperoleh | K_E | + | K_H |
byte output, lalu menguraikan hasilnya ke dalam K_E
dan K_H
diri mereka sendiri. Secara matematis, ini diwakili sebagai berikut.
( K_E || K_H ) = SP800_108_CTR(prf = HMACSHA512, key = "", label = "", context = "")
Contoh: AES-192-CBC + HMACSHA256
Sebagai contoh, pertimbangkan kasus di mana algoritma sandi blok simetris adalah AES-192-CBC dan algoritma validasi HMACSHA256. Sistem akan menghasilkan header konteks menggunakan langkah-langkah berikut.
Pertama, biarkan ( K_E || K_H ) = SP800_108_CTR(prf = HMACSHA512, key = "", label = "", context = "")
, di mana | K_E | = 192 bits
dan | K_H | = 256 bits
per algoritma yang ditentukan. Ini mengarah ke K_E = 5BB6..21DD
dan K_H = A04A..00A9
dalam contoh di bawah ini:
5B B6 C9 83 13 78 22 1D 8E 10 73 CA CF 65 8E B0
61 62 42 71 CB 83 21 DD A0 4A 05 00 5B AB C0 A2
49 6F A5 61 E3 E2 49 87 AA 63 55 CD 74 0A DA C4
B7 92 3D BF 59 90 00 A9
Selanjutnya, komputasi Enc_CBC (K_E, IV, "")
untuk AES-192-CBC yang diberikan IV = 0*
dan K_E
seperti di atas.
result := F474B1872B3B53E4721DE19C0841DB6F
Selanjutnya, komputasi MAC(K_H, "")
untuk HMACSHA256 yang diberikan K_H
seperti di atas.
result := D4791184B996092EE1202F36E8608FA8FBD98ABDFF5402F264B1D7211536220C
Ini menghasilkan header konteks lengkap di bawah ini:
00 00 00 00 00 18 00 00 00 10 00 00 00 20 00 00
00 20 F4 74 B1 87 2B 3B 53 E4 72 1D E1 9C 08 41
DB 6F D4 79 11 84 B9 96 09 2E E1 20 2F 36 E8 60
8F A8 FB D9 8A BD FF 54 02 F2 64 B1 D7 21 15 36
22 0C
Header konteks ini adalah thumbprint dari pasangan algoritma enkripsi terautentikasi (enkripsi AES-192-CBC + validasi HMACSHA256). Komponen, seperti yang dijelaskan di atas adalah:
penanda
(00 00)
panjang kunci cipher blok
(00 00 00 18)
ukuran blok cipher blok
(00 00 00 10)
panjang kunci HMAC
(00 00 00 20)
ukuran hash HMAC
(00 00 00 20)
output
(F4 74 - DB 6F)
PRP cipher blok danoutput
(D4 79 - end)
HMAC PRF .
Catatan
Header konteks enkripsi mode CBC + Autentikasi HMAC dibangun dengan cara yang sama terlepas dari apakah implementasi algoritma disediakan oleh Windows CNG atau oleh jenis SymmetricAlgorithm dan KeyedHashAlgorithm terkelola. Ini memungkinkan aplikasi yang berjalan pada sistem operasi yang berbeda untuk menghasilkan header konteks yang sama dengan andal meskipun implementasi algoritma berbeda antara OS. (Dalam praktiknya, KeyedHashAlgorithm tidak harus menjadi HMAC yang tepat. Ini bisa berupa jenis algoritma hash bertanda kunci.)
Contoh: 3DES-192-CBC + HMACSHA1
Pertama, biarkan ( K_E || K_H ) = SP800_108_CTR(prf = HMACSHA512, key = "", label = "", context = "")
, di mana | K_E | = 192 bits
dan | K_H | = 160 bits
per algoritma yang ditentukan. Ini mengarah ke K_E = A219..E2BB
dan K_H = DC4A..B464
dalam contoh di bawah ini:
A2 19 60 2F 83 A9 13 EA B0 61 3A 39 B8 A6 7E 22
61 D9 F8 6C 10 51 E2 BB DC 4A 00 D7 03 A2 48 3E
D1 F7 5A 34 EB 28 3E D7 D4 67 B4 64
Selanjutnya, komputasi Enc_CBC (K_E, IV, "")
untuk 3DES-192-CBC yang diberikan IV = 0*
dan K_E
seperti di atas.
result := ABB100F81E53E10E
Selanjutnya, komputasi MAC(K_H, "")
untuk HMACSHA1 yang diberikan K_H
seperti di atas.
result := 76EB189B35CF03461DDF877CD9F4B1B4D63A7555
Ini menghasilkan header konteks lengkap yang merupakan thumbprint dari pasangan algoritma enkripsi terautentikasi (enkripsi 3DES-192-CBC + validasi HMACSHA1), yang ditunjukkan di bawah ini:
00 00 00 00 00 18 00 00 00 08 00 00 00 14 00 00
00 14 AB B1 00 F8 1E 53 E1 0E 76 EB 18 9B 35 CF
03 46 1D DF 87 7C D9 F4 B1 B4 D6 3A 75 55
Komponen diuraikan sebagai berikut:
penanda
(00 00)
panjang kunci cipher blok
(00 00 00 18)
ukuran blok cipher blok
(00 00 00 08)
panjang kunci HMAC
(00 00 00 14)
ukuran hash HMAC
(00 00 00 14)
output
(AB B1 - E1 0E)
PRP cipher blok danoutput
(76 EB - end)
HMAC PRF .
Enkripsi + autentikasi Mode Galois/Penghitung
Header konteks terdiri dari komponen berikut:
[16 bit] Nilai 00 01, yang merupakan penanda yang berarti "enkripsi + autentikasi GCM".
[32 bit] Panjang kunci (dalam byte, big-endian) dari algoritma sandi blok simetris.
[32 bit] Ukuran nonce (dalam byte, big-endian) yang digunakan selama operasi enkripsi terautentikasi. (Untuk sistem kami, ini diperbaiki pada ukuran nonce = 96 bit.)
[32 bit] Ukuran blok (dalam byte, big-endian) dari algoritma sandi blok simetris. (Untuk GCM, ini diperbaiki pada ukuran blok = 128 bit.)
[32 bit] Ukuran tag autentikasi (dalam byte, big-endian) yang dihasilkan oleh fungsi enkripsi terautentikasi. (Untuk sistem kami, ini diperbaiki pada ukuran tag = 128 bit.)
[128 bit] Tag
Enc_GCM (K_E, nonce, "")
, yang merupakan output dari algoritma cipher blok simetris yang diberikan input string kosong dan di mana nonce adalah vektor all-zero 96-bit.
K_E
diturunkan menggunakan mekanisme yang sama seperti dalam skenario enkripsi CBC + autentikasi HMAC. Namun, karena tidak K_H
ada permainan di sini, kami pada dasarnya memiliki | K_H | = 0
, dan algoritma runtuh ke formulir di bawah ini.
K_E = SP800_108_CTR(prf = HMACSHA512, key = "", label = "", context = "")
Contoh: AES-256-GCM
Pertama, biarkan K_E = SP800_108_CTR(prf = HMACSHA512, key = "", label = "", context = "")
, di mana | K_E | = 256 bits
.
K_E := 22BC6F1B171C08C4AE2F27444AF8FC8B3087A90006CAEA91FDCFB47C1B8733B8
Selanjutnya, komputasi tag Enc_GCM (K_E, nonce, "")
autentikasi untuk AES-256-GCM yang diberikan nonce = 096
dan K_E
seperti di atas.
result := E7DCCE66DF855A323A6BB7BD7A59BE45
Ini menghasilkan header konteks lengkap di bawah ini:
00 01 00 00 00 20 00 00 00 0C 00 00 00 10 00 00
00 10 E7 DC CE 66 DF 85 5A 32 3A 6B B7 BD 7A 59
BE 45
Komponen diuraikan sebagai berikut:
penanda
(00 01)
panjang kunci cipher blok
(00 00 00 20)
ukuran nonce
(00 00 00 0C)
ukuran blok cipher blok
(00 00 00 10)
ukuran
(00 00 00 10)
tag autentikasi dantag autentikasi dari menjalankan cipher
(E7 DC - end)
blok .
ASP.NET Core
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk