it-swarm-id.com

Bagaimana seharusnya kunci API dihasilkan?

Saya ingin memastikan bahwa permintaan tidak dapat dipalsukan dan dikirim ke server saya. Untuk melakukan ini, saya perlu membuat kunci API per pengguna di sistem saya. Tujuan kuncinya adalah untuk menandatangani permintaan di sisi klien & memvalidasinya di server.

Pertanyaannya adalah, apa kunci API umumnya dibuat? Apakah mereka hanya nomor acak yang aman secara kriptografis (mirip dengan garam kata sandi)? Atau ada beberapa logika di belakang mereka, mis. harus dibuat dari data khusus untuk pengguna.

Dalam sistem saya, setiap pengguna sudah memiliki ID unik (GUID) yang tidak diekspos secara publik, dapatkah saya menggunakan ini sebagai "kunci" saya atau haruskah kunci API berbeda dari ID pengguna?

31
James

Itu tergantung pada seberapa banyak Anda ingin memisahkan peran.

Sistem dasar: "tanda tangan" Anda adalah MAC . "Kunci API" adalah nilai rahasia yang dibagikan antara server dan pengguna. Algoritma MAC normal seperti HMAC dapat menggunakan urutan bit acak sebagai kunci, sehingga kunci mudah dihasilkan dengan menggunakan /dev/urandom (Linux, * BSD , MacOS X), memanggil CryptGenRandom() (Win32) atau menggunakan Java.security.SecureRandom (Java).

Sistem yang disempurnakan: tanda tangan Anda adalah true tanda tangan digital . Ini masuk akal jika Anda ingin memisahkan generator kunci (yang dapat menghasilkan kunci yang akan diterima oleh server) dari server itu sendiri (yang memvalidasi tanda tangan yang masuk). Kunci untuk algoritma tanda tangan adalah objek matematika dengan banyak struktur internal, dan masing-masing algoritma menyiratkan algoritma pembuatan kunci tertentu. Gunakan perpustakaan yang sudah mengimplementasikan bit yang diperlukan (mis. OpenSSL ).


Either way, ada lebih dari itu hanya generasi kunci dan tanda tangan. Misalnya, Anda mungkin ingin menghindari serangan replay: pihak ketiga yang berniat jahat memata-matai jaringan, dan mencatat permintaan yang sah yang ditandatangani oleh pengguna biasa. Kemudian, penyerang mengirim permintaan lagi, lengkap dengan tanda tangannya, sehingga dapat meniru efeknya. Untuk menghindari serangan replay, Anda harus menambahkan semacam protokol eksternal, dan hal-hal ini sulit dilakukan (tidak sulit untuk mendefinisikan protokol; itu adalah sangat sulit untuk mendefinisikan secure protokol). Oleh karena itu, hal yang cerdas untuk dilakukan adalah menggunakan kembali protokol yang sudah ada dan diperiksa dengan baik, yang dalam praktiknya berarti SSL/TLS .

Dengan SSL, "sistem dasar" dikurangi untuk mengirim kunci API dalam header di awal percakapan (itulah yang terjadi dengan otentikasi kata sandi di situs Web HTTPS). "Sistem yang disempurnakan" kemudian "SSL dengan sertifikat klien".

24
Thomas Pornin