Tak więc z wieloma różnymi usługami, API Google, API Twittera, API Facebooka itp.
Każda usługa ma klucz API, taki jak:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
Wszystkie klucze różnią się długością i znakami, które zawierają, zastanawiam się, jakie jest najlepsze podejście do generowania klucza API?
Nie pytam o konkretny język, tylko o ogólne podejście do tworzenia kluczy, czy powinny to być szyfrowanie szczegółów aplikacji użytkownika, hash, czy hash losowego ciągu itp. Czy powinniśmy się martwić o algorytm skrótu (MSD, SHA1, bcrypt) itp.?
Edycja: rozmawiałem z kilkoma przyjaciółmi (e-mail / twitter) i zalecili po prostu użycie identyfikatora GUID z usuniętymi myślnikami.
Wydaje mi się to jednak trochę niezrozumiałe, mając nadzieję na więcej pomysłów.
Odpowiedzi:
Użyj generatora liczb losowych przeznaczonego do kryptografii. Następnie base-64 zakoduje liczbę.
To jest przykład w C #:
var key = new byte[32]; using (var generator = RandomNumberGenerator.Create()) generator.GetBytes(key); string apiKey = Convert.ToBase64String(key);
źródło
apiKey
można było to zadeklarować gdzie indziej. Dla jasności dodałem ten typ.Klucze API muszą mieć te właściwości, które:
Zwykle będziesz mieć tysiące lub miliony kluczy API, a nie miliardy, więc nie muszą:
W związku z tym jednym ze sposobów wygenerowania klucza API jest pobranie dwóch informacji:
i podpisz je za pomocą prywatnego sekretu.
Licznik gwarantuje, że jednoznacznie identyfikuje użytkownika, a podpisywanie zapobiega fałszerstwom. Odwołanie wymaga sprawdzenia, czy klucz jest nadal ważny w bazie danych, zanim zrobisz cokolwiek, co wymaga autoryzacji klucza API.
Dobry generator GUID jest całkiem dobrym przybliżeniem licznika zwiększanego, jeśli musisz generować klucze z wielu centrów danych lub nie masz innego dobrego rozproszonego sposobu przypisywania numerów seryjnych.
Haszowanie nie zapobiega fałszowaniu. Podpisanie gwarantuje, że klucz pochodzi od Ciebie.
źródło
Używam identyfikatorów UUID, zapisanych małymi literami bez myślników.
Generowanie jest łatwe, ponieważ większość języków ma to wbudowane.
Klucze API mogą zostać naruszone, w takim przypadku użytkownik może chcieć anulować swój klucz API i wygenerować nowy, więc Twoja metoda generowania klucza musi być w stanie spełnić to wymaganie.
źródło
UUID uuid = UUID.randomUUID();
z Javą? Czy mówisz, że losowość nie jest wystarczająco dobra?Jeśli potrzebujesz klucza API zawierającego tylko znaki alfanumeryczne, możesz użyć wariantu podejścia losowego base64 , używając zamiast tego tylko kodowania base-62. Podstawa koder-62 opiera się na tym .
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(); }
źródło
Klucz API powinien mieć jakąś losową wartość. Na tyle losowe, że nie można tego przewidzieć. Nie powinien zawierać żadnych szczegółów użytkownika ani konta, dla którego jest przeznaczony. Używanie identyfikatorów UUID to dobry pomysł, jeśli masz pewność, że utworzone identyfikatory są losowe.
Na przykład wcześniejsze wersje systemu Windows generowały przewidywalne identyfikatory GUID, ale to już stara historia.
źródło