Topik wawancara representatif

Wawancara Koding: Mengimplementasikan Verifikasi Tanda Tangan Webhook HMAC

CodingSedang
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Implementasikan sebuah fungsi yang menerima badan permintaan mentah, header tanda tangan, rahasia bersama, dan waktu saat ini, lalu menerima atau menolak webhook dengan aman.

Perintah dan skenario

Penyedia menandatangani stempel waktu dan badan permintaan mentah. Permintaan mungkin tertunda, terduplikasi, salah bentuk (malformed), atau terubah akibat penguraian JSON. Implementasi harus menolak manipulasi dan pemutaran ulang (replay) tanpa membocorkan waktu perbandingan.

Apa yang diuji oleh pewawancara

  • Mempertahankan bita (bytes) yang tepat dan mengurai header tanda tangan terstruktur secara aman.
  • Menghitung HMAC dengan algoritma yang ditentukan dan membandingkannya dalam waktu-konstan.
  • Menerapkan toleransi stempel waktu dan perilaku kegagalan yang jelas.

Pertanyaan klarifikasi sebelum menjawab

  • String bertanda tangan persis apa, algoritma digest, pengodean, dan format header apa yang ditentukan penyedia?
  • Apakah badan permintaan tersedia sebagai bita mentah sebelum penguraian JSON?
  • Berapa toleransi clock-skew dan pengidentifikasi replay apa yang diperlukan?
  • Haruskah input yang salah bentuk mengembalikan penolakan generik tanpa mengungkapkan pemeriksaan mana yang gagal?

Kerangka jawaban 30 detik

Saya akan membaca bita mentah, mengurai stempel waktu dan tanda tangan tanpa memercayai tipenya, menolak stempel waktu di luar jendela yang diizinkan, dan menghitung HMAC atas string kanonikal yang ditentukan penyedia. Saya akan membandingkan bita MAC yang telah didekodekan dengan fungsi primitif waktu-konstan, lalu melakukan deduplikasi ID peristiwa sebelum dimasukkan ke dalam antrean. Kesalahan mengembalikan satu penolakan generik sementara metrik internal mengklasifikasikan kegagalan tersebut.

Pembahasan mendalam langkah demi langkah

1. Simpan badan permintaan mentah

Jangan mengubah JSON yang telah diurai kembali menjadi string untuk verifikasi. Spasi, urutan kunci, dan escaping Unicode dapat mengubah bita. Baca badan permintaan sekali saja, terapkan batas ukuran, dan teruskan bita yang sama ke verifikasi dan penguraian selanjutnya.

2. Urai dan validasi header

Pisahkan header menjadi stempel waktu dan tanda tangan berversi, tolak duplikat atau pengodean yang tidak valid, dan batasi panjang stempel waktu. Konversikan stempel waktu menjadi bilangan bulat dan tolak nilai di luar jendela perbedaan waktu yang dikonfigurasi sebelum menjalankan operasi yang berat.

3. Hitung dan bandingkan

Bangun pesan bertanda tangan yang tepat, hitung HMAC dengan digest yang dikonfigurasi, dekode tanda tangan yang diberikan, dan bandingkan larik bita dengan panjang yang sama menggunakan fungsi waktu-konstan. Jangan pernah membandingkan string heksadesimal dengan kesetaraan biasa ketika penyerang dapat mengukur waktu respons.

4. Cegah replay

Setelah verifikasi tanda tangan, wajibkan ID peristiwa yang stabil dan catat secara atomik dengan periode retensi setidaknya sepanjang jendela stempel waktu yang diterima. Permintaan valid yang duplikat dapat mengembalikan respons sukses tanpa mengulang efek bisnis.

5. Uji batas-batas kasus

Uji bita yang diubah, rahasia yang salah, algoritma yang salah, header yang salah bentuk, stempel waktu masa lalu dan masa depan, tanda tangan duplikat, badan kosong, badan yang terlalu besar, dan ID peristiwa yang berulang. Jaga log agar bebas dari rahasia dan payload lengkap.

Contoh jawaban berkualitas tinggi

“Saya akan mempertahankan badan mentah, mengurai dan membatasi stempel waktu, menolak yang berada di luar jendela replay, dan membangun string bertanda tangan persis seperti yang ditentukan penyedia. Saya akan menghitung HMAC dengan digest yang diperlukan, mendekode tanda tangan, dan menggunakan perbandingan bita waktu-konstan. Setelah verifikasi, saya akan melakukan deduplikasi ID peristiwa secara atomik sebelum memasukkannya ke antrean. Input yang salah bentuk mendapatkan satu penolakan generik; penghitung internal membedakan kegagalan penguraian, waktu, MAC, dan replay.”

Kesalahan umum

  • Memverifikasi JSON yang telah diurai → serialisasi dapat mengubah bita yang ditandatangani → verifikasi badan mentah.
  • Menggunakan kesetaraan string biasa → waktu dapat mengungkap kecocokan parsial → gunakan perbandingan bita waktu-konstan.
  • Melewatkan pemeriksaan stempel waktu → tanda tangan yang valid dapat diputar ulang → terapkan jendela berbatas dan deduplikasi peristiwa.
  • Mencatat header dan payload ke log → rahasia atau data pribadi bocor → hanya catat ID yang aman dan kelas kegagalan.

Pertanyaan lanjutan dan tanggapan

Mengapa memverifikasi sebelum mengurai?

Mengurai terlebih dahulu dapat menormalisasi bita dan dapat menghabiskan aliran permintaan satu kali pakai. Verifikasi harus mencakup tepat apa yang ditandatangani penyedia; lakukan penguraian hanya setelah penerimaan.

Bisakah dua tanda tangan diterima selama rotasi?

Bisa, jika penyedia mendokumentasikan masa tumpang tindih. Coba hanya versi aktif dan versi yang akan dipensiunkan dalam jendela berbatas, catat versi mana yang lolos, dan kedaluwarsakan rahasia lama.

Apakah validasi stempel waktu cukup untuk perlindungan replay?

Tidak. Permintaan yang valid dapat diputar ulang berulang kali di dalam jendela waktu. Simpan ID peristiwa atau digest yang stabil secara atomik dan buat operasi bisnis menjadi idempoten.

Sumber publik

Pertanyaan terkait

Alat wawancara terkait

Gunakan Tangkapan Layar untuk perintah coding

Ambil tangkapan layar soal, lalu telusuri batasan, solusi, kode, edge case, dan kompleksitas secara berurutan.

Lihat alat