31 Stimmen

Beim Arbeiten mit den meisten APIs, warum benötigen sie zwei Arten von Authentifizierung, nämlich einen Schlüssel und ein Geheimnis?

Ich habe mit APIs gearbeitet und mich immer gefragt, warum man einen Schlüssel und ein Geheimnis verwenden muss?

Warum braucht man zwei Arten von Authentifizierung?

68voto

Eugene Osovetsky Punkte 6302

Wenn ein Server einen API-Aufruf erhält, muss er zwei Dinge wissen: Wer den Aufruf tätigt und ob der Aufruf legitim ist.

Wenn Sie nur ein Element ("Schlüssel") hätten und es bei jedem Aufruf einbeziehen würden, würde dies beide Fragen beantworten. Basierend auf dem "Schlüssel" weiß der Server, wer Sie sind, und da nur Sie den Schlüssel kennen, beweist dies, dass der Aufruf tatsächlich von Ihnen stammt. Aber den Schlüssel bei jedem Aufruf einzuschließen, ist keine gute Sicherheitspraxis: Wenn jemand auch nur eine Ihrer Nachrichten während des Transports lesen kann, ist Ihr Schlüssel gefährdet und jemand kann vorgeben, Sie zu sein. Daher funktioniert dieser Ansatz nicht, es sei denn, Sie verwenden HTTPS.

Stattdessen können Sie bei jedem Anruf eine digitale Signatur einbeziehen, die mit einer "geheimen" Zahl signiert ist. (Die "geheime" Zahl selbst wird nicht gesendet). Wenn ein Angreifer Ihre Nachricht lesen kann, wird er nicht in der Lage sein, diese "geheime" Zahl aus der Signatur herauszufinden. (So funktionieren digitale Signaturen: sie sind einseitig).

Aber das löst nicht das Identifikationsproblem: In letzterem Fall wie weiß der Server, wer den Anruf tätigt? Er könnte versuchen, die Signatur mit dem "Geheimnis" jedes einzelnen Benutzers zu überprüfen, aber das würde natürlich sehr zeitaufwändig sein.

Also machen wir folgendes: Senden Sie sowohl einen "Schlüssel" (der den Benutzer identifiziert) als auch eine Signatur, die mit der "geheimen" Nummer erstellt wurde (die beweist, dass die Nachricht legitim ist). Der Server sucht den Benutzer anhand des Schlüssels und validiert dann die Signatur anhand der "geheimen" Nummer dieses Benutzers.

Das ist ein bisschen so, als würden Sie einen Scheck ausstellen: Er hat eine Kontonummer (zur Identifizierung) und Ihre Unterschrift (um zu beweisen, dass Sie es sind). Nur die Kontonummer hätte nicht bewiesen, dass Sie tatsächlich den Scheck ausgestellt haben. Nur die Unterschrift ohne die Kontonummer würde die Bank dazu zwingen, Ihren Scheck mit allen Unterschriften für alle Konten zu vergleichen, was offensichtlich ineffizient wäre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X