REST API security: HMAC / hashing kunci vs JWT

16

Saya baru saja membaca artikel ini yang berumur beberapa tahun tetapi menjelaskan cara cerdas untuk mengamankan API REST Anda. Pada dasarnya:

  • Setiap klien memiliki pasangan kunci publik / pribadi yang unik
  • Hanya klien dan server yang mengetahui kunci pribadi; itu tidak pernah dikirim melalui kawat
  • Dengan setiap permintaan, klien mengambil beberapa input (seluruh permintaan itu sendiri, cap waktu saat ini, dan kunci pribadi) dan menjalankannya melalui fungsi HMAC untuk menghasilkan hash dari permintaan
  • Klien kemudian mengirimkan permintaan normal (yang berisi kunci publik) dan hash ke server
  • Server mencari kunci pribadi klien (berdasarkan kunci publik yang disediakan) dan melakukan beberapa pemeriksaan stempel waktu (yang memang saya tidak mengerti) yang memverifikasi permintaan itu bukan korban dari serangan replay
  • Jika semuanya baik-baik saja, maka server menggunakan kunci pribadi dan fungsi HMAC yang sama untuk menghasilkan hash sendiri dari permintaan
  • Server kemudian membandingkan kedua hash (yang dikirim oleh klien dan juga hash yang dihasilkannya); jika cocok, permintaan diautentikasi dan diizinkan untuk melanjutkan

Saya kemudian menemukan JWT , yang terdengar sangat mirip. Namun artikel pertama tidak menyebutkan JWT sama sekali, dan jadi saya bertanya-tanya apakah JWT berbeda dari solusi auth di atas, dan jika demikian, bagaimana.

smeeb
sumber
1
Lol ... Saya hanya ingin menanyakan pertanyaan yang persis sama dan menemukan pertanyaan Anda. Salah satu hal pertama yang saya temukan tentang otentikasi tanpa negara adalah dari AWS: docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/… , dan mengimplementasikan sesuatu seperti massimilianosciacco.com/… ini . Kemudian saya menemukan JWS / JWT dan entah bagaimana mirip. Tetapi sejauh yang saya mengerti JWT adalah standar dan solusi lain yang dijelaskan di atas adalah beberapa implementasi kustom (tidak standar). Seseorang mengoreksi saya jika saya salah.
nyxz
2
Senang mengetahui bahwa saya bukan satu-satunya yang mengkhawatirkan detail seperti ini! JWT tentu terasa serupa, dan bonusnya adalah standar. Saya hanya ingin tahu bagaimana pameran (keamanan-bijaksana) dengan solusi HMAC khusus ini.
smeeb

Jawaban:

7

Mari kita mulai dengan jawaban yang sangat mendasar.

JWT (seperti yang digunakan dalam konteks OAuth dan OpenID) tidak memerlukan rahasia bersama antara klien dan API. Ada 3 komponen dan pasangan 2 berbagi masing-masing rahasia: klien <-> server identifikasi, server identifikasi <-> API.

Ini memindahkan sebagian besar kompleksitas dari API ke server identifikasi, API hanya perlu memeriksa bahwa token dikeluarkan oleh server identifikasi dan tidak marah. Untuk memverifikasi bahwa API memeriksa bahwa tanda tangan JWT valid dengan rahasia tunggal yang diketahui bersama antara server identifikasi dan API. Itu dia!

Bagaimana server identifikasi memvalidasi identitas pengguna dapat sangat bervariasi (dalam banyak kasus itu adalah pasangan nama pengguna + kata sandi lama melalui koneksi TLS), tetapi tidak berpengaruh pada API Anda.

Privasi dan keamanan pesan dan token itu sendiri ketika menggunakan JWT ditangani oleh TLS, JWT tidak mengetahui masalah tersebut.

Patrick
sumber