2016-06-21 9 views
7

Ich habe einen Dienst, bei dem Benutzer jeweils einen API-Schlüssel haben. Ich muss die Schlüssel speichern, damit sie API-Anfragen validieren können.Speichern von API-Schlüsseln auf dem Server

Wenn ich die Schlüssel in Klartext in meiner Datenbank speichern, mache ich mir Sorgen über das Szenario jemand Zugriff auf die db, greifen alle Klartext API-Schlüssel, dann verwenden sie, um andere zu imitieren (es wird wahrscheinlich größere Probleme geben wenn jemand Zugriff auf die db hat, obwohl).

Das ist vergleichbar mit dem Speichern von Benutzerpasswörtern, wo Sie den Hash speichern und validieren, aber die meisten APIs ermöglichen Ihnen, Ihre API-Schlüssel anzuzeigen, was bedeutet, dass sie auf eine wiederherstellbare Weise gespeichert werden müssen.

Gibt es eine Best Practice dafür?

Dank

Antwort

4

Die Gefahr, dass jemand die Datenbank bekommt und bekommt die Schlüssel bedeutet, dass sie die api-Tasten können die Daten in der Datenbank zuzugreifen, die sie bereits haben, so gibt es keinen Sieg.

Die Bedrohung, dass jemand auf die Datenbank zugreifen kann, erhalten die Passwörter, bedeutet, dass sie diese Passwörter auf anderen Websites mit dem gleichen Benutzernamen wiederverwenden können, weil die Leute dazu neigen, ihre Passwörter wiederzuverwenden.

Ein weiterer Grund dafür, dass Passwörter klar oder leicht umkehrbar sind, ist, dass jemand in Ihrer Firma die Passwörter in die Hände bekommen und anfangen kann, schlechte Dinge zu tun, die als Benutzer fungieren. Was ist ein Risiko, das Sie haben könnten, wenn Ihre API-Schlüssel klar sind?

In der Regel ist HMAC eine Lösung für die kryptografische Berechnung eines sicheren Werts aus einem einzigen geheimen Schlüssel und einem gewissen öffentlichen Wert.

Werfen Sie einen Blick auf HMAC. Mit HMAC können Sie mit der App einen geheimen Schlüssel in den Speicher laden (Konfigurationsdatei, Ablesung von Amazon KMS, beim Start der App eingeben, oder wie auch immer Sie diesen geheimen Schlüssel erhalten möchten).

Speichern Sie in der Datenbank ein Token. Token = UUID() zum Beispiel. Das Token sollte für den Benutzer eindeutig sein, das Token könnte versioniert sein, falls Sie es neu generieren müssen, und das Token könnte zufällig sein (wie UUID). Das Token ist nicht geheim.

Der API-Schlüssel wird mit dem geheimen Schlüssel berechnet (SK) und Benutzer-Token (UT) wie folgt:

API_SECRET = HMAC(SK, UT) 

verteilen dann, dass API_KEY und API_SECRET an den Benutzer, und, wenn der Benutzer versucht, eine Verbindung, Sie berechnen die API_SECRET:

  1. Get Benutzerdatensatz aus der Datenbank (Sie wahrscheinlich schon den Benutzer auffordert, ihren Benutzernamen zur Verfügung zu stellen)
  2. Berechne die API_SECRET vom UT in der Datenbank:

    API_SECRET_DB = HMAC (SK, UT)

  3. Vergleichen der berechneten API_SECRET_DB dem in der Anfrage:

    if (API_SECRET_DB == API_SECRET_FROM_REQUEST) { // login Benutzer }

Unterm Strich schützen Sie nur den geheimen Schlüssel, und nicht jede Sünde gle Credential.

+0

Warum nicht einfach den geheimen Schlüssel des Servers verwenden, um jeden API-Schlüssel zu verschlüsseln? Wenn der API-Schlüssel über eine Anfrage hereinkommt, verschlüsseln Sie ihn und vergleichen Sie ihn mit dem gespeicherten, verschlüsselten Wert. Entschlüsseln Sie den gespeicherten Wert, wenn der API-Schlüssel angezeigt werden soll. –

+0

HAMC ist eine Einweg-Verschlüsselung, die häufig in diesen Szenarien verwendet wird. Betrachten Sie es als eine Art von Verschlüsselung, mit der Ausnahme, dass Sie die Daten nicht entschlüsseln können. – Jonathan

+0

Das OP fragte nach dem Anzeigen von API-Schlüsseln. Für One-Way-Hashing, bei dem Sie das Original nicht wiederherstellen müssen, verwende ich einen Passwort-Hash wie zB bcrypt oder scrypt, damit Sie Key-Stretching und -Salzen erhalten. –

Verwandte Themen