Gesaan dan konteks
Perkhidmatan konfigurasi berbilang penyewa mesti menyulitkan nilai pangkalan data yang sensitif. Setiap penyewa mempunyai kunci logik bebas; platform mesti memutar kunci punca (root keys), membaca teks sifer lama dan mengesan teks sifer yang disalin merentasi penyewa atau rekod. Gunakan crypto/hpke Go 1.26 untuk mereka bentuk sampul, aliran penyulitan/penyahsulitan, versi kunci, pengikatan konteks dan migrasi. Kemahiran teras ialah gubahan API kriptografi dan reka bentuk kitaran hayat yang betul, jadi ini ialah soalan coding.
Perkara yang dinilai oleh penemu duga
Pertama, sama ada anda memahami peranan HPKE KEM, KDF dan AEAD serta membezakan pengkapsulan kunci awam daripada penyulitan data simetri.
Kedua, sama ada anda boleh memilih mod Base, PSK atau Auth dan menerangkan sempadan antara kunci pengesahan dengan kunci kerahsiaan.
Ketiga, sama ada penyewa, tujuan, suite dan versi terikat dalam info atau AAD untuk mengelakkan penyahsulitan silang konteks.
Keempat, sama ada pemutaran, pembacaan versi lama, pembatalan (revocation) dan penyulitan semula direka bentuk tanpa menganggap nombor versi sebagai rahsia.
Kelima, sama ada ujian usikan, main semula (replay), kerawakan, maklumat kegagalan dan kesalingoperasian mengesahkan pelaksanaan tersebut.
Soalan untuk dijelaskan terlebih dahulu
- Adakah kerahsiaan mencukupi, atau adakah penghantar mesti disahkan secara kriptografi?
- Siapakah yang memiliki kunci awam penerima, dan adakah keperluan KMS, HSM serta audit wujud?
- Berapa lamakah teks sifer lama kekal, dan adakah penyulitan semula latar belakang diperlukan?
- Adakah hubungan penyewa dan kunci konfigurasi dibenarkan menjadi metadata yang boleh dilihat?
- Adakah penyahsulitan silang bahasa atau pemulihan luar talian diperlukan?
- Patutkah kunci hilang, versi tidak disokong dan kegagalan pengesahan dapat dibezakan?
Jawapan 30 saat
“Saya menetapkan suite RFC 9180 dan Go 1.26. Perkhidmatan menyimpan kunci persendirian penerima bagi setiap penyewa, manakala aplikasi mengkapsul dengan kunci awamnya. Sampul menyimpan suite dan versi kunci; penyewa dan tujuan diikat dalam info manakala penyewa, kunci dan versi rekod dalam AEAD AAD. Penyahsulitan memilih kunci persendirian lama mengikut versi sampul. Operasi tulis baharu menggunakan versi yang diputar dan tugas latar belakang menyulitkan semula data lama. Saya memilih Auth hanya apabila bukti penghantar diperlukan. Ujian meliputi usikan, pertukaran silang penyewa, main semula, kerawakan, versi lama dan vektor silang bahasa.”
Penyelesaian terperinci
Langkah 1: Asingkan lapisan sampul
HPKE mewujudkan rahsia kongsi dengan KEM, menerbitkan kunci dengan KDF dan menyulitkan mesej dengan AEAD. Sampul menyimpan suite, versi kunci, bahan terkapsul, nonce atau teks sifer bersiri dan metadata awam. Kunci punca dan persendirian penerima kekal dalam KMS atau HSM, tidak sekali-kali dalam teks sifer atau log aplikasi.
Langkah 2: Pilih mod dan semantik identiti
Mod Base memberikan penyulitan kunci awam penerima tanpa pengesahan penghantar. PSK menambah kunci pra-kongsi. Auth menggunakan kunci penghantar untuk mengesahkan punca. Identiti log masuk platform tidak bermakna HPKE telah mengesahkan penghantar; kebenaran dan mod kriptografi ialah lapisan yang berasingan.
Langkah 3: Ikat konteks
Ikat protokol, perkhidmatan, versi dan tujuan dalam info. Ikat ID penyewa, kunci konfigurasi dan versi rekod dalam AEAD AAD apabila medan tersebut dihantar bersama sampul dan mesti kekal utuh. Penyahsulitan mengira semula input yang sama, jadi pertukaran penyewa, tujuan atau versi akan gagal dalam pengesahan.
envelope = suite_id | key_version | encapsulated_key | aad_fields | ciphertext
info = "config-envelope/v1" | tenant_scope | purpose
aad = tenant_id | config_key | record_versionLangkah 4: Reka bentuk kitaran hayat kunci
Setiap versi kunci mempunyai masa penciptaan, keadaan, skop penyahsulitan dan dasar pemusnahan. Terbitkan kunci awam baharu sebelum menukar operasi tulis; operasi baca memilih kunci persendirian lama mengikut versi sampul. Kekalkan versi lama sebagai baca sahaja sehingga penyulitan semula dan semakan audit selesai, kemudian batalkannya.
Langkah 5: Kendalikan main semula dan pensirilan
AEAD mengesan usikan tetapi tidak menghalang teks sifer lama yang sah daripada diserahkan semula. Jika konfigurasi mempunyai versi atau jujukan monotonik, lapisan perniagaan menyemak versi yang dijangkakan. Gunakan medan panjang, versi dan suite yang eksplisit serta tolak suite yang tidak diketahui, pemotongan (truncation) atau medan pendua.
Langkah 6: Tentukan sempadan ralat
Kembalikan kegagalan penyahsulitan yang seragam secara luaran. Audit sebab berstruktur dan versi kunci secara dalaman, tidak sekali-kali kunci persendirian, teks biasa atau teks sifer lengkap. Membezakan kunci yang hilang, format yang tidak disokong dan kegagalan pengesahan membantu operasi, tetapi pemanggil yang tidak dipercayai tidak seharusnya mengetahui kewujudan penyewa atau kunci daripada masa tindak balas atau mesej.
Langkah 7: Bina ujian dan migrasi
Uji vektor RFC tetap, kerawakan, usikan satu bait, AAD silang penyewa, bacaan versi lama, pemutaran serentak, kegagalan selepas pembatalan dan pemecahan mesej besar (chunking). Sistem silang bahasa memerlukan pensirilan dan vektor kongsi. Perkhidmatan pra-1.26 menggunakan pembungkus keserasian atau pintu naik taraf; API eksperimen tidak memasuki pengeluaran secara tidak sengaja.
Contoh jawapan berkualiti tinggi
“Saya menggunakan HPKE sebagai lapisan sampul: KEM dan KDF mewujudkan dan menerbitkan kunci kongsi, manakala AEAD melindungi teks biasa konfigurasi. Sampul mengandungi suite, versi kunci, bahan terkapsul dan teks sifer; penyewa, tujuan, kunci dan versi rekod diikat melalui info dan AAD untuk menghentikan salinan silang penyewa. Base hanya memberikan kerahsiaan penerima; saya memilih Auth atau tandatangan luar apabila bukti penghantar diperlukan. Pemutaran menulis versi baharu terlebih dahulu, mengekalkan versi lama sebagai baca sahaja, menyulitkan semula di latar belakang, kemudian membatalkannya selepas pengesahan. AEAD tidak menghalang main semula, jadi versi perniagaan disemak. Kunci persendirian kekal dalam KMS/HSM, dan ujian merangkumi usikan, pembatalan, ralat dan vektor silang bahasa.”
Kesilapan lazim
- Menganggap Base sebagai pengesahan penghantar → penerima tidak dapat membuktikan siapa yang menghantarnya → gunakan Auth atau tandatangan luar.
- Meletakkan penyewa hanya dalam metadata yang boleh dilihat → penyerang boleh menukar teks sifer merentasi penyewa → ikat dalam
infoatau AAD. - Memadamkan kunci lama serta-merta selepas pemutaran → data sejarah menjadi tidak boleh dibaca → kekalkan tetingkap baca sahaja dan lakukan penyulitan semula dahulu.
- Menganggap AEAD menghalang main semula → teks sifer lama yang sah boleh diserahkan semula → semak versi perniagaan atau jujukan.
- Menyimpan kunci persendirian dalam konfigurasi atau log → sempadan penyulitan dipecahkan → gunakan KMS/HSM dan keistimewaan paling sedikit (least privilege).
- Mencipta format binari tanpa versi → migrasi dan penolakan suite menjadi tidak selamat → kodkan versi, panjang dan suite yang eksplisit.
- Mengembalikan ralat penyahsulitan terperinci → kewujudan penyewa atau kunci mungkin bocor → gunakan ralat luaran yang seragam dan audit dalaman.
- Hanya menguji kejayaan → kegagalan usikan dan versi lama sampai ke pengeluaran → tambah ujian vektor, silang konteks dan pembatalan.
Soalan susulan
Susulan 1: Mengapakah tidak menyulitkan semua teks biasa secara terus dengan RSA atau ECDH?
HPKE menggabungkan KEM, KDF dan AEAD secara eksplisit, yang sesuai untuk mengkapsul kunci sesi simetri dan mengendalikan mesej yang besar. Penyulitan kunci awam secara terus bagi teks biasa arbitrari mengundang penyalahgunaan panjang, kerawakan dan mod.
Susulan 2: Bilakah mod Auth sesuai digunakan?
Gunakan Auth apabila penerima memerlukan bukti kriptografi bahawa kunci penghantar yang diketahui telah mengambil bahagian. Jika hanya kerahsiaan penerima diperlukan, jangan tambah kunci pengesahan yang tidak diurus.
Susulan 3: Apakah perbezaan antara info dan AAD?
info mengambil bahagian dalam penerbitan kunci dan mentakrifkan konteks protokol. AAD kekal kelihatan tetapi dilindungi integritinya oleh AEAD, menjadikannya sesuai untuk metadata sampul yang mesti sepadan semasa penyahsulitan.
Susulan 4: Bagaimanakah anda menyulitkan semula dengan selamat?
Baca versi lama dan tulis versi baharu dalam transaksi idempoten atau aliran kerja yang boleh dicuba semula. Hanya batalkan kunci lama selepas teks sifer baharu lulus penyahsulitan-dan-baca-semula serta semakan audit.
Susulan 5: Bagaimanakah anda menghentikan teks sifer daripada dipindahkan ke rekod lain?
Letakkan penyewa, kunci konfigurasi, versi rekod dan tujuan dalam AAD, dan bina semula AAD daripada nilai pangkalan data semasa semasa membaca. Sampul yang disalin kemudiannya akan gagal tag pengesahannya.
Susulan 6: Adakah HPKE menyediakan kerahsiaan ke hadapan (forward secrecy)?
Ciri ini bergantung pada kitaran hayat kunci dan mod. Dengan kunci persendirian penerima statik yang tahan lama, perlindungan teks sifer sejarah bergantung pada kunci tersebut. Kerahsiaan ke hadapan yang lebih kukuh memerlukan kunci fana (ephemeral keys), pemutaran, pemusnahan dan sesi peringkat protokol; nama API semata-mata tidak menyediakannya.