it-swarm.com.de

Muss ich API-Schlüssel hashen oder verschlüsseln, bevor ich sie in einer Datenbank speichere?

Ich sichere API-Aufrufe an einen REST -Dienst, den ich mithilfe von API-Schlüsseln erstelle. Der Plan lautet:

  1. Wenn wir einen neuen Client erhalten, generieren Sie einen API-Schlüssel (eine UUID).
  2. Senden Sie den API-Schlüssel per E-Mail an sie.
  3. Sie senden den API-Schlüssel bei jedem Aufruf an unseren Service (über HTTPS). Wir werden den API-Schlüssel in unserer Datenbank nachschlagen (entweder verschlüsseln oder zuerst hashen) und herausfinden, für welches Konto der API-Schlüssel bestimmt ist.

Schließlich werden wir Benutzerkonten und ein Portal für all dies hinzufügen, damit Clients API-Schlüssel generieren und deaktivieren können, ohne dass wir involviert sein müssen.

Meine Frage ist im letzten Teil. Sollte ich die API-Schlüssel hashen oder verschlüsseln (oder unverschlüsselt lassen?), Bevor ich sie in der Datenbank speichere? Ich versuche die Implikationen zu verstehen. Ich weiß, wenn ich sie hashe, schütze ich mich vor jemandem, der alle API-Schlüssel kennt, wenn er DB-Zugriff erhält. Aber woran sollte ich noch denken? Gibt es zum Beispiel Leistungsgründe, um übereinander zu arbeiten?

6
Daniel Hipke

Ja, Sie sollten Ihre API-Schlüssel unbedingt hashen. Tatsächlich sind sie Ihre Passwörter und sollten als solche behandelt werden. Und beachten Sie, dass gehasht - nicht verschlüsselt. Sie müssen die API-Schlüssel niemals entschlüsseln, daher sollten Sie dies nicht können.

Wie saghaulor sagt, müssen Sie sicherstellen, dass Sie eine UUID der Version 4 (also eine zufällige) verwenden und dass Sie beim Generieren eine kryptografisch sichere Zufallsquelle verwenden. Da eine korrekt generierte UUID 122 Bit Entropie enthält, müssen Sie sich keine Gedanken über das Salzen oder die Verwendung einer langsamen Hash-Funktion wie bcrypt machen. Eine einzige Runde SHA-256 würde ausreichen.

Ein problematischer Teil Ihres Designs besteht darin, dass Sie Benutzern "Passwörter" geben, die per E-Mail zugestellt werden und die sie nicht ändern können. Für sicherheitsbewusste Benutzer ist dies möglicherweise nicht gut genug. Vielleicht löst das von Ihnen erwähnte Portal dieses Problem.

8
Anders

1) Stellen Sie sicher, dass Sie einen sicheren Zufallsgenerator verwenden, um Ihre UUID zu generieren.

2) Senden Sie den API-Schlüssel nicht per E-Mail. E-Mail hat keine Garantie für einen sicheren Transport, dh Sie senden den Schlüssel wahrscheinlich im Klartext.

3) Wie Sie den Authentifizierungsmechanismus implementieren, wirkt sich darauf aus, wie Sie den API-Schlüssel speichern können.

Wenn Sie den API-Schlüssel als Primärschlüssel verwenden, können Sie ihn nicht hashen oder verschlüsseln, da eine Suche effektiv nicht möglich ist, wenn Sie ihn korrekt gehasht oder verschlüsselt haben.

Wenn Sie dem Benutzer eine Kombination aus Primärschlüssel und API-Schlüssel zur Verfügung stellen, können Sie den API-Schlüssel sicher speichern. Da der Schlüssel effektiv ein Passwort ist, sollte Hashing ausreichend sein und wird empfohlen.

Denken Sie daran, den Algorithmus korrekt zu verwenden. Im Allgemeinen erfordert das Hashing für jede Aufzeichnung ein Salz. Es gibt verschiedene Hashing-Algorithmen. Einige, wie bcrypt und scrypt, können künstliche Latenzzeiten hinzufügen, um das brutale Forcen zu verlangsamen. Dies kann für Ihren Anwendungsfall geeignet sein oder nicht. Einige Algorithmen wie MD5 und SHA1 werden nicht empfohlen, da sie sich als unsicher erwiesen haben.

Sie könnten den Schlüssel ohne Salz hashen und dann einfache Suchen durchführen. Dies ist nicht so sicher wie das Hashing mit Salz, aber die Sicherheit dieses Ansatzes kann für Ihre Zwecke ausreichend sein.

1
saghaulor