Mit vielen verschiedenen Diensten, Google APIs, Twitter API, Facebook API usw. usw.
Jeder Dienst verfügt über einen API-Schlüssel wie:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
Alle Schlüssel variieren in der Länge und den darin enthaltenen Zeichen. Ich frage mich, wie man am besten einen API-Schlüssel generiert.
Ich frage nicht nach einer bestimmten Sprache, sondern nur nach dem allgemeinen Ansatz zum Erstellen von Schlüsseln, falls es sich um eine Verschlüsselung von Details der Benutzer-App oder um einen Hash oder einen Hash einer zufälligen Zeichenfolge usw. handelt. Sollten wir uns über den Hash-Algorithmus Gedanken machen? (MSD, SHA1, bcrypt) usw.?
Bearbeiten: Ich habe mit einigen Freunden (E-Mail / Twitter) gesprochen und sie haben empfohlen, nur eine GUID mit den Strichen zu verwenden.
Das scheint mir allerdings ein wenig hackig zu sein, in der Hoffnung, weitere Ideen zu bekommen.
Antworten:
Verwenden Sie einen Zufallszahlengenerator für die Kryptografie. Dann codiert Base-64 die Nummer.
Dies ist ein C # -Beispiel:
var key = new byte[32]; using (var generator = RandomNumberGenerator.Create()) generator.GetBytes(key); string apiKey = Convert.ToBase64String(key);
quelle
apiKey
es anderswo deklariert werden konnte. Ich habe den Typ der Klarheit halber hinzugefügt.API-Schlüssel müssen die folgenden Eigenschaften haben:
Normalerweise haben Sie Tausende oder Millionen von API-Schlüsseln, nicht Milliarden, daher müssen sie nicht:
Eine Möglichkeit, einen API-Schlüssel zu generieren, besteht darin, zwei Informationen zu verwenden:
und unterschreiben Sie sie mit einem privaten Geheimnis.
Der Zähler garantiert, dass sie den Benutzer eindeutig identifizieren, und die Signatur verhindert Fälschungen. Für die Sperrbarkeit muss überprüft werden, ob der Schlüssel in der Datenbank noch gültig ist, bevor Maßnahmen ergriffen werden, für die eine API-Schlüsselautorisierung erforderlich ist.
Ein guter GUID-Generator ist eine ziemlich gute Annäherung an einen inkrementierten Zähler, wenn Sie Schlüssel aus mehreren Rechenzentren generieren müssen oder auf andere Weise keine gut verteilte Möglichkeit haben, Seriennummern zuzuweisen.
Das Hashing verhindert keine Fälschung. Durch das Signieren wird garantiert, dass der Schlüssel von Ihnen stammt.
quelle
Ich verwende UUIDs, die ohne Bindestriche in Kleinbuchstaben formatiert sind.
Die Generierung ist einfach, da die meisten Sprachen sie eingebaut haben.
API-Schlüssel können kompromittiert werden. In diesem Fall möchte ein Benutzer möglicherweise seinen API-Schlüssel abbrechen und einen neuen generieren. Daher muss Ihre Schlüsselgenerierungsmethode diese Anforderung erfüllen können.
quelle
UUID uuid = UUID.randomUUID();
in Java? Wollen Sie damit sagen, dass Zufall nicht gut genug ist?Wenn Sie einen API-Schlüssel mit nur alphanumerischen Zeichen möchten, können Sie eine Variante des base64-Random- Ansatzes verwenden und stattdessen nur eine Base-62-Codierung verwenden. Der Base-62-Encoder basiert darauf .
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(); }
quelle
Ein API-Schlüssel sollte ein zufälliger Wert sein. Zufällig genug, dass es nicht vorhergesagt werden kann. Es sollte keine Details des Benutzers oder Kontos enthalten, für das es bestimmt ist. Die Verwendung von UUIDs ist eine gute Idee, wenn Sie sicher sind, dass die erstellten IDs zufällig sind.
Frühere Versionen von Windows haben beispielsweise vorhersehbare GUIDs erstellt, aber dies ist eine alte Geschichte.
quelle