Saya menggunakan Auth0 untuk menangani otentikasi di aplikasi web saya. Saya menggunakan ASP.NET Core v1.0.0 dan Angular 2 rc5 dan saya tidak tahu banyak tentang otentikasi / keamanan secara umum.
Dalam dokumen Auth0 untuk ASP.NET Core Web Api , ada dua pilihan untuk algoritma JWT yaitu RS256 dan HS256. Ini mungkin pertanyaan bodoh tapi:
Apa perbedaan antara RS256 dan HS256? Apa sajakah kasus penggunaan (jika ada)?
jwt
auth0
asp.net-core-webapi
Rico Kahler
sumber
sumber
Jawaban:
Kedua pilihan merujuk pada algoritma apa yang digunakan penyedia identitas untuk menandatangani JWT. Penandatanganan adalah operasi kriptografi yang menghasilkan "tanda tangan" (bagian dari JWT) yang dapat divalidasi oleh penerima token untuk memastikan bahwa token tersebut belum dirusak.
RS256 (RSA Signature dengan SHA-256 ) adalah algoritma asimetris , dan menggunakan pasangan kunci publik / pribadi: penyedia identitas memiliki kunci pribadi (rahasia) yang digunakan untuk menghasilkan tanda tangan, dan konsumen JWT mendapatkan kunci publik untuk memvalidasi tanda tangan. Karena kunci publik, tidak seperti kunci pribadi, tidak perlu dijaga keamanannya, sebagian besar penyedia identitas membuatnya mudah tersedia bagi konsumen untuk mendapatkan dan menggunakan (biasanya melalui URL metadata).
HS256 ( HMAC dengan SHA-256), di sisi lain, melibatkan kombinasi fungsi hashing dan satu kunci (rahasia) yang dibagi antara dua pihak yang digunakan untuk menghasilkan hash yang akan berfungsi sebagai tanda tangan. Karena kunci yang sama digunakan baik untuk menghasilkan tanda tangan dan untuk memvalidasinya, perhatian harus diberikan untuk memastikan bahwa kunci tersebut tidak dikompromikan.
Jika Anda akan mengembangkan aplikasi yang menggunakan JWT, Anda dapat menggunakan HS256 dengan aman, karena Anda akan memiliki kontrol pada siapa yang menggunakan kunci rahasia. Jika, di sisi lain, Anda tidak memiliki kendali atas klien, atau Anda tidak memiliki cara untuk mengamankan kunci rahasia, RS256 akan lebih cocok, karena konsumen hanya perlu mengetahui kunci publik (dibagi).
Karena kunci publik biasanya tersedia dari titik akhir metadata, klien dapat diprogram untuk mengambil kunci publik secara otomatis. Jika ini masalahnya (seperti halnya dengan pustaka .Net Core), Anda akan memiliki lebih sedikit pekerjaan yang harus dilakukan pada konfigurasi (pustaka akan mengambil kunci publik dari server). Kunci simetris, di sisi lain, perlu ditukar keluar dari band (memastikan saluran komunikasi yang aman), dan diperbarui secara manual jika ada rollover kunci penandatanganan.
Auth0 menyediakan titik akhir metadata untuk protokol OIDC, SAML dan WS-Fed, di mana kunci publik dapat diambil. Anda dapat melihat titik akhir tersebut di bawah "Pengaturan Lanjut" dari klien.
Titik akhir metadata OIDC, misalnya, berbentuk
https://{account domain}/.well-known/openid-configuration
. Jika Anda meramban ke URL itu, Anda akan melihat objek JSON dengan referensihttps://{account domain}/.well-known/jwks.json
, yang berisi kunci publik (atau kunci) dari akun tersebut.Jika Anda melihat sampel RS256, Anda akan melihat bahwa Anda tidak perlu mengkonfigurasi kunci publik di mana saja: itu diambil secara otomatis oleh kerangka kerja.
sumber
Dalam kriptografi ada dua jenis algoritma yang digunakan:
Algoritma simetris
Satu kunci digunakan untuk mengenkripsi data. Saat dienkripsi dengan kunci, data dapat didekripsi menggunakan kunci yang sama. Jika, misalnya, Mary mengenkripsi pesan menggunakan kunci "rahasia saya" dan mengirimkannya kepada John, ia akan dapat mendekripsi pesan dengan benar dengan kunci yang sama "rahasia saya".
Algoritma asimetris
Dua kunci digunakan untuk mengenkripsi dan mendekripsi pesan. Sementara satu kunci (publik) digunakan untuk mengenkripsi pesan, kunci lainnya (pribadi) hanya dapat digunakan untuk mendekripsi pesan itu. Jadi, John dapat menghasilkan kunci publik dan pribadi, kemudian hanya mengirim kunci publik kepada Mary untuk mengenkripsi pesannya. Pesan hanya dapat didekripsi menggunakan kunci pribadi.
Skenario HS256 dan RS256
Algoritma ini TIDAK digunakan untuk mengenkripsi / mendekripsi data. Sebaliknya mereka digunakan untuk memverifikasi asal atau keaslian data. Ketika Mary perlu mengirim pesan terbuka ke Jhon dan ia perlu memverifikasi bahwa pesan tersebut pasti dari Mary, HS256 atau RS256 dapat digunakan.
HS256 dapat membuat tanda tangan untuk sampel data tertentu menggunakan kunci tunggal. Ketika pesan dikirimkan bersama dengan tanda tangan, pihak penerima dapat menggunakan kunci yang sama untuk memverifikasi bahwa tanda tangan cocok dengan pesan.
RS256 menggunakan sepasang tombol untuk melakukan hal yang sama. Tanda tangan hanya dapat dibuat menggunakan kunci pribadi. Dan kunci publik harus digunakan untuk memverifikasi tanda tangan. Dalam skenario ini, bahkan jika Jack menemukan kunci publik, ia tidak dapat membuat pesan palsu dengan tanda tangan untuk meniru Mary.
sumber
Ada perbedaan kinerja.
Sederhananya
HS256
adalah sekitar 1 urutan lebih cepat dari padaRS256
untuk verifikasi tetapi sekitar 2 urutan lebih cepat dari padaRS256
untuk penerbitan (penandatanganan).Jangan terpaku pada angka sebenarnya, pikirkan saja mereka dengan hormat satu sama lain.
[Program.cs]
sumber
jawaban singkat, khusus untuk OAuth2,
sumber