Sicherer Weg zum Speichern von entschlüsselbaren Passwörtern

8

Ich mache eine Anwendung in PHP und es gibt eine Anforderung, dass es möglich sein muss, die Kennwörter zu entschlüsseln, um zukünftige Probleme beim Wechseln der Benutzerdatenbank zu anderen Systemen zu vermeiden. Bedenken Sie, dass es nicht möglich ist, die Passwortmethode dieses zukünftigen Systems zu ändern, und ich brauche Klartextpasswörter, um die Passwörter generieren zu lassen.

Es ist geplant, das Passwort des Benutzers mit einem öffentlichen Schlüssel zu verschlüsseln, der auf dem Server gespeichert ist. Die Authentifizierung erfolgt durch Verschlüsseln der Eingabe und Vergleichen der Ergebnisse. Es wird KEINE Entschlüsselung durchgeführt. Der private Schlüssel, der die Entschlüsselung durchführen kann, wird für die spätere Verwendung extern gespeichert.

Welchen Verschlüsselungs- / Entschlüsselungsalgorithmus würden Sie vorschlagen? Sind die verschlüsselten Passwörter immer noch so sicher wie Hashing (MD5 / SHA1), wenn der private Schlüssel für den Angreifer nicht verfügbar ist?

    
Jammer 31.03.2010, 19:50
quelle

5 Antworten

8

Ich werde Jammers Ansatz umformulieren -

  1. Erzeugt ein öffentliches / privates Schlüsselpaar. Hard-Code den öffentlichen Schlüssel auf Ihrem Webserver. Speichern Sie den privaten Schlüssel in einem physischen Bankschließfach außerhalb der Reichweite von Webserver / Datenbank / Entwickler.
  2. Wenn sich der Benutzer anmeldet, verschlüsseln Sie das Passwort + salt mit dem öffentlichen Schlüssel. Dieser Schritt ist identisch mit der Verwendung eines Hash-Algorithmus. Speichern Sie das verschlüsselte Passwort + Salz in der Datenbank.
  3. Wenn Sie das Kennwort überprüfen möchten, verschlüsseln Sie es erneut und vergleichen Sie es mit dem in der Datenbank gespeicherten Wert.

Wenn ein Angreifer die Datenbank erhält, kann er die Kennwörter nicht entschlüsseln, da er nicht über den privaten Schlüssel verfügt. Er kann den privaten Schlüssel nicht bekommen, weil er in einem Banktresor außerhalb seiner Reichweite ist. Zwei identische Passwörter werden wegen des Salzes immer noch in der Datenbank gespeichert.

Ich empfehle den obigen Ansatz nicht, da zu irgendeinem Zeitpunkt in der Zukunft jemand den privaten Schlüssel missbrauchen und Zugang zu allen Passwörtern erhalten könnte.

Aber wenn Sie garantieren, dass der private Schlüssel immer privat bleibt, sehe ich keinen technischen Fehler.

Ich könnte natürlich falsch liegen.

    
Sripathi Krishnan 31.03.2010 22:34
quelle
4

Entschlüssel das Passwort nicht. Wenn Sie das Passwortsystem in Zukunft ändern müssen, fügen Sie ein Feld namens storage_type (oder was auch immer) hinzu.

Wenn Sie dann die Passwörter ändern müssen, prüfen Sie, ob es ein altes Passwort ist. Wenn dies der Fall ist, können Sie beim nächsten Login die Passwortkodierung ändern. Andernfalls melden Sie sich mit dem neuen System an.

    
Macha 31.03.2010 20:35
quelle
2

Die Möglichkeit, die Passwörter zu entschlüsseln, ist eine schlechte Idee (und es gibt wahrscheinlich keine Möglichkeit, dies zu tun, die viel besser wäre, als sie unverschlüsselt zu speichern). Es scheint, dass das Hauptproblem darin besteht, die Kennwörter zu verwenden, wenn Sie Ihre Speichermethode ändern. Tun Sie einfach, was Linux tut, speichern Sie, wie Sie das Passwort mit dem Passwort hashen. Also zum Beispiel $ 1 $ salt $ hash ist MD5. Auf diese Weise können Sie, wenn Sie sich entscheiden, wie die Passwörter gespeichert werden, nach den alten Passwörtern suchen (und wenn sich jemand korrekt anmeldet, können Sie sein Passwort mit dem neuen Hash aktualisieren).

    
Brendan Long 31.03.2010 20:28
quelle
1

Das einzige Problem, das ich sehe, ist, dass der meiste Public-Private-Key-Verschlüsselungscode einen symmetrischen Schlüssel mit dem öffentlichen Schlüssel verschlüsselt und darauf beruht, dass der private Schlüssel entschlüsselt wird. Verwenden Sie dann den symmetrischen Schlüssel, um die Nachricht zu verschlüsseln. p>

Sie möchten den öffentlichen Schlüssel verwenden, um das Passwort + salt direkt zu verschlüsseln.

So Angriffe gegen Ihr System kochen auf:

  1. Angriffe gegen die Verschlüsselung des allgemeinen öffentlichen / privaten Schlüssels
  2. Angriffe gegen Ihren privaten Schlüsselspeicher.
Douglas Leeder 02.04.2010 07:49
quelle
0

Für die meisten Anwendungen ist es mehr als ausreichend, SHA-1-Hashes von Passwörtern zu speichern.

Ja, es gibt bekannte Kollisionen in den meisten Hashalgorithmen, aber das bedeutet keinen tatsächlichen Angriffsvektor. Vor allem, wenn Sie die Hashes einsalzen.

Für Ihr salt: Speichern Sie es in einer Konfigurationsdatei, die von außen nicht zugänglich ist, aber von Ihrer PHP-Installation gelesen werden kann.

    
selfawaresoup 31.03.2010 20:31
quelle