Gesaan dan skop
API muat naik fail mesti membenarkan klien mengesahkan bahawa kandungan HTTP tidak ditulis semula oleh get laluan (gateway) atau cache. Berdasarkan RFC 9530, reka bentuk penggunaan Content-Digest, Repr-Digest, dan Want-Repr-Digest, serta terangkan sempadannya dengan TLS, tandatangan, dan percubaan semula (retries).
Soalan ini menguji sama ada anda boleh mengikat digest pada lapisan HTTP yang betul: Content-Digest merangkumi kandungan mesej sebenar, Repr-Digest menerangkan perwakilan (representation) terpilih, dan Want-Repr-Digest menyatakan keutamaan penerima untuk digest perwakilan. Digest memeriksa integriti kandungan; secara sendirinya ia tidak membuktikan siapa yang menghantar mesej tersebut.
Perkara yang diuji oleh penemu duga
Kupas perbezaan antara kandungan mesej dan perwakilan, pemilihan algoritma yang selamat, perundingan permintaan dan respons, sempadan proksi dan pemampatan, pengiraan penstriman (streaming), mesin keadaan (state machine) kegagalan digest, dan gabungan digest yang betul dengan pengesahan (authentication), TLS, percubaan semula, dan keidempotennan (idempotency).
Jawapan 30 saat
"Saya terlebih dahulu mentakrifkan objek dan sempadan bait yang sedang disahkan. Klien pemuat naik mengira Content-Digest, dan pelayan mengesahkannya semasa menstrim mesej yang diterima. Pelayan boleh mengembalikan Repr-Digest, yang disemak oleh klien terhadap perwakilan akhir. Want-Repr-Digest menyampaikan keutamaan algoritma; pelayan hanya memilih algoritma kukuh yang dibenarkan dan merekodkan hasilnya. Ketidakpadanan akan menghentikan penghantaran atau ketekalan (persistence). Pengesahan penghantar masih diperoleh daripada TLS, HTTP Message Signatures, atau token akses."
Penyelesaian langkah demi langkah
Langkah 1: Tentukan objek yang dilindungi
Nyatakan sama ada matlamatnya adalah kandungan mesej yang dipindahkan atau perwakilan selepas perundingan kandungan. Content-Digest digunakan pada kandungan mesej sebenar; Repr-Digest menerangkan perwakilan yang dipilih. Digest perwakilan tidak boleh mengesahkan jujukan bait yang berbeza selepas transkod.
Langkah 2: Pilih algoritma digest
Gunakan senarai izin (allowlist) yang mengandungi algoritma yang diluluskan pada masa ini seperti SHA-256 atau SHA-512, dan tolak pilihan legasi seperti MD5 atau SHA-1. Semasa menghuraikan medan berstruktur, tolak algoritma pendua, parameter yang tidak diketahui, dan pengekodan yang salah bentuk supaya pustaka yang berbeza tidak mentafsirkan satu nilai secara berbeza.
Langkah 3: Sahkan permintaan
Klien pemuat naik mengira Content-Digest ke atas bait mesej akhir. Pelayan mengiranya semasa membaca dan hanya membandingkannya selepas mesej tamat. Ketidakpadanan menghalang komit objek dan penerbitan peristiwa; output separa tidak sekali-kali dianggap sebagai kejayaan. Muat naik yang besar harus distrim dan bukannya dibimbit (buffered) dalam memori.
Langkah 4: Sahkan respons
Pelayan boleh menghantar Repr-Digest dalam respons. Klien mengira digest ke atas perwakilan terpilih yang dinyahkod mengikut peraturan yang dirundingkan. Jika pemampatan terlibat, protokol mesti menyatakan sama ada digest merangkumi mesej yang dimampatkan atau perwakilan yang tidak dimampatkan; klien tidak boleh mencampuradukkan lapisan-lapisan tersebut.
Langkah 5: Gunakan Want-Repr-Digest
Klien boleh menghantar Want-Repr-Digest dengan keutamaan algoritma dan pemberat. Pelayan boleh memenuhinya, memilih algoritma lain yang dibenarkan, atau mengabaikan medan respons. Klien mesti membezakan antara "digest tidak disediakan" dan "ketidakpadanan digest"; ketiadaan medan bukanlah pengesahan yang berjaya.
Langkah 6: Kendalikan proksi dan cache
Pukulan cache (cache hit) masih memerlukan digest yang sepadan dengan perwakilan semasa. Jika get laluan memampatkan semula, mentranskod, atau menggabungkan kandungan, ia mesti mengira semula digest yang berkaitan; menyalin medan huluan (upstream) menghasilkan keputusan palsu. Menulis semula medan di luar bait yang diliputi oleh digest tidak merosakkan digest secara automatik, tetapi ia boleh mengubah semantik tandatangan atau kebenaran (authorization).
Langkah 7: Gabungkan pengesahan dan perlindungan main semula (replay protection)
Digest membuktikan hubungan bait, bukannya identiti penghantar, dan ia tidak menghalang mesej yang sah daripada dihantar semula. Gunakan TLS, HTTP Message Signatures, atau token untuk pengesahan penghantar. Gunakan nonce, tetingkap masa, dan kunci keidempotennan perniagaan untuk mengelakkan caj pendua. Nilai digest bukanlah kelayakan kebenaran.
Langkah 8: Tentukan kegagalan dan kebolehcerapan
Dedahkan metrik dan kelas ralat yang berasingan untuk ketidakpadanan, algoritma yang tidak dibenarkan, medan salah bentuk, dan medan yang hilang. Bersihkan objek sementara selepas pengesahan muat naik gagal; buang respons cache yang tidak disahkan dan cetuskan dasar percubaan semula. Logkan algoritma, ID permintaan, saiz, dan kelas kegagalan, jangan sekali-kali mencatat kandungan sensitif atau muatan (payload) lengkap.
Pertukaran (trade-offs) dan sempadan
Content-Digest atau Repr-Digest
Content-Digest sesuai untuk mengesahkan perkara yang sebenarnya dipindahkan oleh mesej HTTP ini. Repr-Digest sesuai untuk cache, perundingan kandungan, dan pengesahan perwakilan sumber. Kedua-duanya boleh wujud bersama, tetapi protokol mesti mendokumentasikan sempadan bait dan susunan penyahkodan.
Digest atau tandatangan digital
Digest memerlukan kos pengiraan yang rendah dan mengesan perubahan dalam transit atau storan. Tandatangan digital pula mengesahkan pemegang kunci dan menyokong pengesahan rentas sistem. Tandatangan boleh merangkumi medan digest untuk mengikat integriti kandungan kepada kaedah dan sasaran, tetapi digest itu sendiri tidak mempunyai sifat identiti.
Gagal tertutup (fail closed) atau susut nilai (degrade)
Pembayaran, pakej perisian, dan arkib terkawal harus menolak digest yang hilang atau tidak sepadan. Sumber statik biasa dengan digest pilihan boleh diteruskan selepas merekodkan amaran, tetapi pemanggil mesti tahu bahawa integriti tidak disahkan; ia tidak boleh ditandakan sebagai dipercayai secara senyap.
Latih tubi kegagalan dan evolusi
Get laluan memampatkan semula respons
Arahkan get laluan menukar pemampatan, kemudian sahkan bahawa klien masih menghas lapisan perwakilan yang ditakrifkan oleh protokol. Jika get laluan menukar lapisan yang diliputi, ia mesti menjana medan baharu.
Satu bait berubah semasa muat naik
Gantikan satu bait dalam proksi dan sahkan bahawa pelayan melaporkan ketidakpadanan Content-Digest sebelum melakukan komit pada objek, kemudian membuang data sementara dan peristiwa hiliran (downstream).
Penurunan taraf algoritma atau medan hilang
Hantar keutamaan yang mengandungi algoritma legasi dan sahkan bahawa pelayan menolak pilihan yang tidak dibenarkan. Buang Repr-Digest dan sahkan bahawa klien memasuki cabang "tidak disahkan" dan bukannya cabang kejayaan.
Kesilapan lazim dan susulan
Kesilapan 1: Menganggap digest sebagai pengesahan (authentication)
Susulan: Bolehkah penyerang mengira semula digest untuk kandungan mereka sendiri? Ya. TLS, tandatangan, atau token masih diperlukan untuk mengesahkan penghantar.
Kesilapan 2: Mengabaikan lapisan pemampatan dan perwakilan
Susulan: Bolehkah digest huluan disalin ke respons yang dimampatkan semula? Hanya apabila lapisan bait yang diliputi tidak berubah; jika tidak, ia mesti dikira semula.
Kesilapan 3: Menganggap medan yang hilang sebagai disahkan
Susulan: Bagaimana jika pelayan mengabaikan digest yang diminta? Tandakan hasil sebagai tidak disahkan atau tolak mengikut dasar; ketiadaan bukanlah satu padanan.
Susulan lebih mendalam dan jawapan model
Mengapakah permintaan muat naik boleh menggunakan Content-Digest?
Penghantar boleh menyediakan digest sebelum penghantaran atau semasa penstriman selesai, membolehkan penerima mengesahkan bait sebelum ketekalan (persistence). Objek besar harus dihas secara berperingkat (incrementally) dan bukannya dibimbit.
Adakah medan digest berfungsi sebagai perlindungan main semula (replay protection)?
Tidak. Mesej sah yang sama boleh dihantar semula. Perlindungan main semula memerlukan tetingkap masa, nonce, liputan tandatangan, dan status keidempotennan perniagaan.
Patutkah proksi memadamkan digest huluan?
Hanya apabila ia mengubah bait yang diliputi dan tidak dapat mengira semula medan tersebut, ia harus mengalih keluar atau menandakannya tidak boleh digunakan. Jika ia boleh mengira semula, ia harus menjana nilai untuk mesej atau perwakilan akhir dan mendokumentasikan sempadan tanggungjawab.