Jadi dengan banyak layanan berbeda saat ini, Google API, Twitter API, Facebook API, dll.
Setiap layanan memiliki kunci API, seperti:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
Semua kunci memiliki panjang yang berbeda-beda dan karakter yang dikandungnya, saya bertanya-tanya apa pendekatan terbaik untuk menghasilkan kunci API?
Saya tidak meminta bahasa tertentu, hanya pendekatan umum untuk membuat kunci, apakah itu enkripsi detail aplikasi pengguna, atau hash, atau hash dari string acak, dll. Haruskah kita khawatir tentang algoritme hash (MSD, SHA1, bcrypt) dll?
Sunting: Saya telah berbicara dengan beberapa teman (email / twitter) dan mereka merekomendasikan hanya menggunakan GUID dengan tanda hubung dilucuti.
Ini tampaknya sedikit hacky bagi saya, berharap mendapatkan lebih banyak ide.
Jawaban:
Gunakan generator nomor acak yang dirancang untuk kriptografi. Kemudian base-64 menyandikan nomor tersebut.
Ini adalah contoh C #:
var key = new byte[32]; using (var generator = RandomNumberGenerator.Create()) generator.GetBytes(key); string apiKey = Convert.ToBase64String(key);
sumber
apiKey
dapat dideklarasikan di tempat lain. Saya menambahkan tipe untuk kejelasan.Kunci API harus memiliki properti yang:
Biasanya Anda akan memiliki ribuan atau jutaan kunci API, bukan miliaran, jadi mereka tidak perlu:
Karena itu, salah satu cara untuk menghasilkan kunci API adalah dengan mengambil dua informasi:
dan menandatanganinya menggunakan rahasia pribadi.
Penghitung menjamin bahwa mereka secara unik mengidentifikasi pengguna, dan penandatanganan mencegah pemalsuan. Pencabutan memerlukan pemeriksaan bahwa kunci tersebut masih valid dalam database sebelum melakukan apa pun yang memerlukan otorisasi kunci API.
Generator GUID yang baik adalah perkiraan yang cukup bagus dari penghitung tambahan jika Anda perlu menghasilkan kunci dari beberapa pusat data atau tidak memiliki cara terdistribusi yang baik untuk menetapkan nomor seri.
Hashing tidak mencegah pemalsuan. Penandatanganan adalah apa yang menjamin bahwa kunci tersebut berasal dari Anda.
sumber
Saya menggunakan UUID, diformat dalam huruf kecil tanpa tanda hubung.
Pembuatannya mudah karena sebagian besar bahasa memiliki bawaan.
Kunci API dapat disusupi, dalam hal ini pengguna mungkin ingin membatalkan kunci API mereka dan membuat yang baru, sehingga metode pembuatan kunci Anda harus dapat memenuhi persyaratan ini.
sumber
UUID uuid = UUID.randomUUID();
di Jawa? Apakah Anda mengatakan bahwa acak tidak cukup baik?Jika Anda menginginkan kunci API dengan hanya karakter alfanumerik, Anda dapat menggunakan varian dari pendekatan acak base64 , hanya menggunakan enkode base-62 saja. Encoder base-62 didasarkan pada ini .
public static string CreateApiKey() { var bytes = new byte[256 / 8]; using (var random = RandomNumberGenerator.Create()) random.GetBytes(bytes); return ToBase62String(bytes); } static string ToBase62String(byte[] toConvert) { const string alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; BigInteger dividend = new BigInteger(toConvert); var builder = new StringBuilder(); while (dividend != 0) { dividend = BigInteger.DivRem(dividend, alphabet.Length, out BigInteger remainder); builder.Insert(0, alphabet[Math.Abs(((int)remainder))]); } return builder.ToString(); }
sumber
Kunci API harus berupa nilai acak. Cukup acak sehingga tidak bisa diprediksi. Ini tidak boleh berisi detail pengguna atau akun apa pun. Menggunakan UUID adalah ide yang bagus, jika Anda yakin bahwa ID yang dibuat acak.
Versi Windows sebelumnya menghasilkan GUID yang dapat diprediksi, misalnya, tetapi ini adalah cerita lama.
sumber