Ich bin auf viele APIs gestoßen, die dem Benutzer sowohl einen API- Schlüssel als auch ein Geheimnis geben . Aber meine Frage ist: Was ist der Unterschied zwischen beiden?
In meinen Augen kann ein Schlüssel ausreichen. Angenommen, ich habe einen Schlüssel und nur ich und der Server wissen es. Ich erstelle einen HMAC-Hash mit diesem Schlüssel und führe einen API-Aufruf durch. Auf dem Server erstellen wir den HMAC-Hash erneut und vergleichen ihn mit dem gesendeten Hash. Wenn es dasselbe ist, wird der Anruf authentifiziert.
Warum also zwei Schlüssel verwenden?
Bearbeiten: Oder wird dieser API-Schlüssel zum Nachschlagen des API-Geheimnisses verwendet?
api
security
authentication
api-key
secret-key
EsTeGe
quelle
quelle
Antworten:
Die Kryptografie mit geheimen Schlüsseln basiert auf der Verwendung desselben Schlüssels zum Codieren und späteren Dekodieren einer Nachricht. Somit können nur diejenigen, die das "Geheimnis" kennen, die Nachricht lesen.
Die RSA-Sicherheit basiert auf 2 übereinstimmenden Schlüsseln. Für jeden Benutzer gibt es einen öffentlichen Schlüssel, den jeder kennen kann (sollte). Es gibt auch einen privaten Schlüssel, den nur der Benutzer kennen sollte. Eine mit dem öffentlichen Schlüssel verschlüsselte Nachricht kann nur mit dem privaten Schlüssel entschlüsselt werden und umgekehrt.
Wenn ich Ihnen also eine Nachricht senden möchte, die nur Sie lesen können, erhalte ich (vom Netzwerk) Ihren öffentlichen Schlüssel, verschlüssele die Nachricht mit diesem Schlüssel und Sie sind die einzige Person, die sie entschlüsseln kann.
Wenn ich Ihnen beweisen möchte, dass ich eine Nachricht gesendet habe, kann ich die Nachricht mit meinem privaten Schlüssel verschlüsseln und Ihnen (in offenem Text oder in einer anderen Nachricht) mitteilen, wie sie verschlüsselt wurde. Dann könnten Sie die Nachricht mit meinem öffentlichen Schlüssel entschlüsseln, und wenn sie lesbar wird, wissen Sie, dass sie von mir stammt.
Diese Form der Verschlüsselung ist ziemlich computerintensiv. Manchmal wird also ein einmaliger "geheimer Schlüssel" mit RSA-Technologie verschlüsselt, dann der Rest der Nachricht mit dem geheimen Schlüssel verschlüsselt und dann meine Signatur auf die zweite Weise verschlüsselt. Sie kehren diesen Vorgang dann um. Wenn die Nachricht und die Signatur lesbar sind, können Sie und nur Sie sie lesen, und Sie können sicher sein, dass ich die Nachricht gesendet habe.
ODER
Sie können diesen Link für eine detailliertere Erklärung besuchen.
Wie funktionieren API-Schlüssel und geheime Schlüssel?
quelle
Sie benötigen zwei separate Schlüssel, einen, der ihnen sagt, wer Sie sind, und einen, der beweist, dass Sie der sind, für den Sie sich ausgeben .
Der "Schlüssel" ist Ihre Benutzer-ID und das "Geheimnis" ist Ihr Passwort. Sie verwenden nur die Begriffe "Schlüssel" und "Geheimnis", weil sie es so implementiert haben.
quelle
Bearer:
Authentifizierung? Sie hätten dort einen Ausweis und einen PwD.Einfache Antwort, wenn ich es richtig verstanden habe ...
Wenn Sie Ihren API-Schlüssel zur Verschlüsselung verwenden, woher weiß der Dienst, wer ihn kontaktiert? Wie werden sie diese Nachricht entschlüsseln?
Sie verwenden den API-Schlüssel, um anzugeben, wer Sie sind. Dies senden Sie im Klartext. Den SECRET-Schlüssel senden Sie an niemanden. Sie verwenden es einfach zur Verschlüsselung. Dann senden Sie die verschlüsselte Nachricht. Sie senden nicht den Schlüssel, der für die Verschlüsselung verwendet wurde, da dies den Zweck zunichte machen würde.
quelle
secret
im Klartext gesendet habe. Kannst du mir einen Link geben? Was ich gesehen habe, istsecret
das Verschlüsseln einiger Daten. Und zusammen mit den verschlüsselten Daten senden,apiKey
damit der Server weiß, wie die Daten zu entschlüsseln sind.secret
undapiKey
und was sie tatsächlich tun, istusername
undpassword
. Was ganz anders ist ...Es gibt Antworten, die erklären, was der geheime und (öffentliche) Schlüssel ist. Es ist ein öffentlich-privates Schlüsselpaar, dem sie verwirrende Namen geben. Aber niemand sagt, warum die APIs beides erfordern, und viele APIs geben Ihnen nur ein Geheimnis! Ich habe auch noch nie gesehen, dass API-Dokumente erklären, warum sie zwei Schlüssel haben. Das Beste, was ich tun kann, ist zu spekulieren ...
Es ist am besten, nur Ihren öffentlichen Schlüssel in Ihre Anfrage aufzunehmen und die Anfrage lokal mit Ihrem privaten Schlüssel zu signieren. Das Senden von mehr sollte nicht erforderlich sein. Aber einige kommen davon, nur das Geheimnis in der Anfrage zu haben. Ok, jede gute API verwendet eine gewisse Transportsicherheit wie TLS (normalerweise über HTTPS). Sie stellen Ihren privaten Schlüssel jedoch weiterhin auf diese Weise dem Server zur Verfügung und erhöhen so das Risiko, dass er ihn irgendwie falsch behandelt (siehe: Der kürzlich entdeckte Fehler bei der Kennwortprotokollierung von GitHub und Twitter). Und HTTPS ist theoretisch genauso sicher, aber es gibt immer Implementierungsfehler.
Bei vielen - eigentlich den meisten - APIs müssen Sie jedoch beide Schlüssel in Anfragen senden, da dies einfacher ist, als die Benutzer dazu zu bringen, ihre eigenen Signaturen zu erstellen. kann sonst keine reinen cURL-Beispiele haben! In diesem Fall ist es sinnlos, sie getrennt zu haben. Ich denke, die separaten Schlüssel sind nur für den Fall gedacht, dass sie die API später ändern, um sie zu nutzen. Oder einige haben eine Client-Bibliothek, die dies möglicherweise sicherer macht.
quelle
Eine Sache, die ich hier nicht erwähnt habe, obwohl sie eine Erweiterung von Marcus Adams 'Antwort ist, ist, dass Sie keine einzige Information verwenden sollten, um einen Benutzer zu identifizieren und zu authentifizieren, wenn die Möglichkeit von Timing-Angriffen besteht , die dies können Verwenden Sie die Unterschiede in den Antwortzeiten, um zu erraten, wie weit ein Zeichenfolgenvergleich gekommen ist.
Wenn Sie ein System verwenden, das einen "Schlüssel" verwendet, um den Benutzer oder die Anmeldeinformationen nachzuschlagen, können diese Informationen im Laufe der Zeit schrittweise erraten werden, indem Tausende von Anforderungen gesendet und die Zeit untersucht werden, die Ihre Datenbank benötigt, um sie zu finden (oder nicht) finde) einen Datensatz. Dies gilt insbesondere dann, wenn der "Schlüssel" im Klartext anstelle eines Einweg-Hash des Schlüssels gespeichert ist. Sie möchten die Schlüssel der Benutzer im Klartext oder symmetrisch verschlüsselt speichern, wenn Sie den Schlüssel dem Benutzer erneut anzeigen möchten.
Wenn Sie über eine zweite Information oder ein "Geheimnis" verfügen, können Sie zuerst den Benutzer oder den Berechtigungsnachweis mithilfe des "Schlüssels" nachschlagen, der für einen Timing-Angriff anfällig sein könnte, und dann mithilfe einer zeitsicheren Vergleichsfunktion den Wert von überprüfen das Geheimnis".
Hier ist Pythons Implementierung dieser Funktion:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
Und es ist in der
hmac
Bibliothek (und wahrscheinlich auch in anderen) ausgesetzt :https://docs.python.org/3/library/hmac.html#hmac.compare_digest
Eine Sache, die hier zu beachten ist, ist, dass ich nicht denke, dass diese Art von Angriff auf Werte funktioniert, die vor der Suche gehasht oder verschlüsselt wurden, da sich die verglichenen Werte jedes Mal zufällig ändern, wenn sich ein Zeichen in der Eingabezeichenfolge ändert. Ich habe hier eine gute Erklärung dafür gefunden .
Lösungen zum Speichern von API-Schlüsseln wären dann:
Von diesen denke ich, dass 3 das beste Gleichgewicht zwischen Sicherheit und Komfort ist. Ich habe gesehen, dass dies auf vielen Websites implementiert wurde, als Schlüssel ausgegeben wurden.
Außerdem lade ich alle tatsächlichen Sicherheitsexperten ein, diese Antwort zu kritisieren. Ich wollte dies nur als weiteren Diskussionspunkt herausbringen.
quelle