it-swarm-eu.dev

Wie sollen API-Schlüssel generiert werden?

Ich möchte sicherstellen, dass Anfragen nicht gefälscht und an meinen Server weitergeleitet werden können. Dazu muss ich pro Benutzer auf meinem System einen API-Schlüssel generieren. Der Zweck des Schlüssels besteht darin, Anforderungen auf der Clientseite zu signieren und auf dem Server zu validieren.

Die Frage ist, woraus bestehen API-Schlüssel im Allgemeinen? Sind sie nur eine kryptografisch sichere Zufallszahl (ähnlich einem Passwort-Salt)? Oder steckt eine Logik dahinter, z. sollten sie aus benutzerspezifischen Daten bestehen.

In meinem System hat jeder Benutzer bereits eine eindeutige ID (GUID), die nicht öffentlich zugänglich gemacht wird. Kann ich diese als "Schlüssel" verwenden oder sollte sich ein API-Schlüssel von einer Benutzer-ID unterscheiden?

31
James

Dies hängt davon ab, wie stark Sie Rollen trennen möchten.

Basissystem: Ihre "Signatur" ist ein MAC . Der "API-Schlüssel" ist ein geheimer Wert, der zwischen dem Server und dem Benutzer geteilt wird. Normale MAC-Algorithmen wie HMAC können beliebige Bitfolgen als Schlüssel verwenden, sodass ein Schlüssel einfach mit /dev/urandom (Linux, * BSD) generiert werden kann , MacOS X), CryptGenRandom() (Win32) aufrufen oder Java.security.SecureRandom (Java) verwenden.

Erweitertes System: Ihre Signatur ist eine echte digitale Signatur . Dies ist sinnvoll, wenn Sie den Schlüsselgenerator (der Schlüssel erstellen kann, die vom Server akzeptiert werden) vom Server selbst (der die eingehenden Signaturen überprüft) trennen möchten. Schlüssel für Signaturalgorithmen sind mathematische Objekte mit vielen internen Strukturen, und jeder Algorithmus impliziert einen bestimmten Algorithmus zur Schlüsselgenerierung. Verwenden Sie eine Bibliothek, die bereits die erforderlichen Bits implementiert (z. B. OpenSSL ).


In beiden Fällen steckt mehr dahinter als nur Schlüsselgenerierung und Signaturen. Zum Beispiel möchten Sie wahrscheinlich vermeiden, dass Wiederholungsangriffe: ein böswilliger Dritter das Netzwerk ausspioniert und eine gültige Anfrage aufzeichnet, die von einem regulären Benutzer signiert wurde. Später sendet der Angreifer die Anfrage erneut mit ihrer Signatur, um den Effekt zu replizieren. Um Wiederholungsangriffe zu vermeiden, müssen Sie externe Protokolle hinzufügen, und diese Dinge sind schwer zu tun (es ist nicht schwer, ein Protokoll zu definieren; es ist sehr schwer, ein sicher Protokoll). Daher ist es klug, ein vorhandenes, gut geprüftes Protokoll wiederzuverwenden, was in der Praxis SSL/TLS bedeutet.

Bei SSL reduziert sich das "Basissystem" darauf, den API-Schlüssel zu Beginn der Konversation in einem Header zu senden (genau das passiert bei der Kennwortauthentifizierung auf HTTPS-Websites). Das "erweiterte System" ist dann "SSL mit einem Client-Zertifikat".

24
Thomas Pornin