Saya menemukan banyak API yang memberi pengguna kunci API dan rahasia . Tapi pertanyaan saya adalah: apa perbedaan keduanya?
Di mata saya, satu kunci sudah cukup. Katakanlah saya memiliki kunci dan hanya saya dan server yang mengetahuinya. Saya membuat hash HMAC dengan kunci ini dan melakukan panggilan API. Di server, kami membuat hash HMAC lagi dan membandingkannya dengan hash yang dikirim. Jika sama, panggilan diautentikasi.
Jadi mengapa menggunakan dua kunci?
Edit: atau apakah kunci API itu digunakan untuk mencari rahasia API?
api
security
authentication
api-key
secret-key
EsTeGe
sumber
sumber
Jawaban:
Kriptografi kunci rahasia bergantung pada penggunaan kunci yang sama untuk menyandikan dan kemudian mendekode pesan. Jadi, hanya mereka yang mengetahui "rahasia" yang dapat membaca pesan tersebut.
Keamanan RSA didasarkan pada 2 kunci yang cocok. Ada kunci publik untuk setiap pengguna, dan semua orang bisa (harus) mengetahuinya. Ada juga kunci pribadi yang hanya diketahui oleh pengguna. Pesan yang dienkripsi oleh kunci publik hanya dapat didekripsi dengan kunci privat, dan sebaliknya.
Jadi, jika saya ingin mengirimi Anda pesan yang hanya dapat dibaca oleh Anda, saya mendapatkan (dari jaringan) kunci publik Anda, mengenkripsi pesan dengan kunci itu dan Anda adalah satu-satunya orang yang dapat mendekripsinya.
Atau, jika saya ingin membuktikan kepada Anda bahwa saya telah mengirim pesan, saya dapat mengenkripsi pesan tersebut dengan kunci pribadi saya, memberi tahu Anda (dalam teks terbuka atau dalam pesan lain) bagaimana pesan itu dienkripsi. Kemudian Anda dapat mendekripsi pesan dengan kunci publik saya, dan jika dapat dibaca, Anda tahu itu berasal dari saya.
Bentuk enkripsi ini cukup intensif di komputer, jadi yang terkadang dilakukan adalah mengenkripsi "kunci rahasia" satu kali dengan teknologi RSA, kemudian mengenkripsi sisa pesan dengan kunci rahasia, lalu mengenkripsi tanda tangan saya dengan cara kedua. Anda kemudian membalikkan proses ini jadi jika pesan dan tanda tangannya dapat dibaca, Anda dan hanya Anda yang dapat membacanya dan Anda yakin bahwa saya mengirim pesan tersebut.
ATAU
Anda dapat mengunjungi tautan ini untuk penjelasan lebih detail.
Bagaimana cara kerja Kunci API dan Kunci Rahasia?
sumber
Anda membutuhkan dua kunci terpisah, satu yang memberi tahu mereka siapa Anda, dan satu lagi yang membuktikan bahwa Anda adalah yang Anda katakan .
"Kunci" adalah ID pengguna Anda, dan "rahasia" adalah sandi Anda. Mereka hanya menggunakan istilah "kunci" dan "rahasia" karena begitulah cara mereka menerapkannya.
sumber
Bearer:
otentikasi untuk itu? Anda akan memiliki ID dan pwd di sana.Jawaban sederhana, jika saya memahaminya dengan benar ...
Jika Anda menggunakan kunci API Anda untuk enkripsi, bagaimana layanan tahu siapa yang menghubungi mereka? Bagaimana mereka akan mendekripsi pesan itu?
Anda menggunakan kunci API untuk menyatakan siapa Anda, inilah yang Anda kirimkan dalam teks biasa. Kunci RAHASIA tidak Anda kirim ke siapa pun. Anda cukup menggunakannya untuk enkripsi. Kemudian Anda mengirim pesan terenkripsi. Anda tidak mengirim kunci yang digunakan untuk enkripsi, itu akan menggagalkan tujuan.
sumber
secret
dalam bentuk teks biasa. Bisakah Anda memberi saya tautan? Apa yang saya lihat digunakansecret
untuk mengenkripsi beberapa data. Dan bersama dengan data yang dienkripsi, pengirimanapiKey
sehingga server tahu cara mendekripsi data.secret
danapiKey
dan apa yang mereka benar-benar lakukan adalahusername
danpassword
. Yang benar-benar berbeda ...Ada jawaban yang menjelaskan apa rahasia dan kunci (publik) itu. Ini adalah pasangan kunci publik-pribadi yang mereka beri nama yang membingungkan. Tetapi tidak ada yang mengatakan mengapa API membutuhkan keduanya, dan banyak API hanya memberi Anda satu rahasia! Saya juga belum pernah melihat dokumen API mana pun yang menjelaskan mengapa mereka memiliki dua kunci, jadi yang terbaik yang bisa saya lakukan adalah berspekulasi ...
Yang terbaik adalah meletakkan kunci publik Anda dalam permintaan Anda dan menandatangani permintaan secara lokal dengan kunci pribadi Anda; mengirim apa pun lagi seharusnya tidak diperlukan. Tetapi beberapa lolos hanya dengan memiliki rahasia dalam permintaan. Oke, API apa pun yang bagus akan menggunakan beberapa keamanan transportasi seperti TLS (biasanya melalui HTTPS). Tapi Anda masih mengekspos kunci pribadi Anda ke server seperti itu, meningkatkan risiko mereka entah bagaimana salah menanganinya (lihat: GitHub dan bug pencatatan kata sandi Twitter baru-baru ini ditemukan). Dan HTTPS secara teoritis sama amannya, tetapi selalu ada kekurangan implementasi di luar sana.
Tetapi banyak - sebenarnya kebanyakan - API meminta Anda mengirim kedua kunci dalam permintaan karena itu lebih mudah daripada membuat orang membuat tanda tangan mereka sendiri; tidak dapat memiliki contoh cURL murni sebaliknya! Dalam hal ini, tidak ada gunanya memisahkan mereka. Saya kira kunci terpisah hanya untuk jika mereka mengubah API nanti untuk memanfaatkannya. Atau beberapa memiliki pustaka klien yang mungkin melakukannya dengan cara yang lebih aman.
sumber
Satu hal yang tidak saya lihat disebutkan di sini, meskipun ini merupakan perpanjangan dari jawaban Marcus Adams, adalah bahwa Anda tidak boleh menggunakan satu pun informasi untuk mengidentifikasi dan mengautentikasi pengguna jika ada kemungkinan serangan waktu , yang dapat gunakan perbedaan waktu respons untuk menebak seberapa jauh perbandingan string.
Jika Anda menggunakan sistem yang menggunakan "kunci" untuk mencari pengguna atau kredensial, informasi tersebut dapat ditebak secara bertahap dari waktu ke waktu dengan mengirimkan ribuan permintaan dan memeriksa waktu yang diperlukan database Anda untuk menemukan (atau tidak temukan) sebuah catatan. Hal ini terutama berlaku jika "kunci" disimpan dalam teks biasa, bukan dalam hash kunci satu arah. Anda ingin menyimpan kunci pengguna dalam teks biasa atau dienkripsi secara simetris jika Anda perlu menampilkan kembali kunci tersebut kepada pengguna.
Dengan memiliki informasi kedua, atau "rahasia", pertama-tama Anda dapat mencari pengguna atau kredensial menggunakan "kunci", yang mungkin rentan terhadap serangan waktu, kemudian menggunakan fungsi perbandingan aman waktu untuk memeriksa nilai rahasia".
Berikut adalah implementasi Python untuk fungsi itu:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
Dan itu diekspos di
hmac
lib (dan mungkin lainnya):https://docs.python.org/3/library/hmac.html#hmac.compare_digest
Satu hal yang perlu diperhatikan di sini adalah saya tidak berpikir bahwa serangan semacam ini akan bekerja pada nilai yang di-hash atau dienkripsi sebelum pencarian, karena nilai yang dibandingkan berubah secara acak setiap kali karakter dalam string input berubah. Saya menemukan penjelasan yang bagus tentang ini di sini .
Solusi untuk menyimpan kunci API selanjutnya adalah:
Dari jumlah tersebut, saya pikir 3 adalah keseimbangan terbaik antara keamanan dan kenyamanan. Saya telah melihat ini diterapkan di banyak situs web ketika mendapatkan kunci yang dikeluarkan.
Juga, saya mengundang pakar keamanan yang sebenarnya untuk mengkritik jawaban ini. Saya hanya ingin mengeluarkan ini sebagai poin diskusi lain.
sumber