Unterschied zwischen dem Hashing eines Passworts und dem Verschlüsseln


140

Die aktuelle Top-Abstimmung zu dieser Frage lautet:

Ein anderes Problem, das nicht so sehr ein Sicherheitsproblem darstellt, obwohl es sicherheitsrelevant ist, ist ein vollständiger und erbärmlicher Fehler, den Unterschied zwischen dem Hashing eines Kennworts und dem Verschlüsseln zu erkennen . Am häufigsten in Code zu finden, in dem der Programmierer versucht, unsichere Funktionen zum Erinnern an mein Kennwort bereitzustellen.

Was genau ist dieser Unterschied? Ich hatte immer den Eindruck, dass Hashing eine Form der Verschlüsselung ist. Auf welche unsichere Funktionalität bezieht sich das Poster?


Ein gut geschriebener Artikel darüber, warum Sie Ihre Geheimnisse / Passwörter nicht einfach hashen sollten. Verwenden Sie stattdessen HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

Hervorragende Zusammenfassung des Themas im StackExchange-Sicherheitsblog: security.blogoverflow.com/2011/11/…
David J. Liszewski

@ JayKumar: Der Artikel, den Sie verlinkt haben, ist sehr irreführend. Es kombiniert Passwortsalze (von denen erwartet wird, dass sie für Angreifer sichtbar sind) mit MAC-Schlüsseln (von denen erwartet wird, dass sie geheim bleiben). Der Link von David J. Liszewski bietet eine viel genauere Beschreibung.
Rufflewind

Antworten:


222

Hashing ist eine Einwegfunktion (also ein Mapping). Es ist irreversibel, Sie wenden den sicheren Hash-Algorithmus an und können die ursprüngliche Zeichenfolge nicht zurückerhalten. Das Beste, was Sie tun können, ist, eine sogenannte "Kollision" zu generieren, dh eine andere Zeichenfolge zu finden, die denselben Hash bereitstellt. Kryptografisch sichere Hash-Algorithmen sollen das Auftreten von Kollisionen verhindern. Sie können einen sicheren Hash mithilfe einer Regenbogentabelle angreifen , der Sie entgegenwirken können, indem Sie vor dem Speichern ein Salz auf den Hash auftragen.

Die Verschlüsselung ist eine ordnungsgemäße (bidirektionale) Funktion. Es ist reversibel. Sie können die entstellte Zeichenfolge entschlüsseln, um die ursprüngliche Zeichenfolge zu erhalten, wenn Sie den Schlüssel haben.

Die unsichere Funktion, auf die es sich bezieht, besteht darin, dass bei der Verschlüsselung der Kennwörter in Ihrer Anwendung der Schlüssel irgendwo gespeichert ist und ein Angreifer, der Zugriff auf Ihre Datenbank (und / oder den Code) erhält, die ursprünglichen Kennwörter erhalten kann, indem er sowohl den Schlüssel als auch den verschlüsselten Text abruft , während es mit einem Hash unmöglich ist.

Die Leute sagen normalerweise, wenn ein Cracker Ihre Datenbank oder Ihren Code besitzt, braucht er kein Passwort, daher ist der Unterschied umstritten. Dies ist naiv, da Sie immer noch die Pflicht haben, die Passwörter Ihrer Benutzer zu schützen, vor allem, weil die meisten von ihnen immer wieder dasselbe Passwort verwenden, wodurch sie einem größeren Risiko ausgesetzt sind, indem sie ihre Passwörter verlieren.


1
Um klar zu sein, erhalten Sie die gewünschte Sicherheit mit dem Hash. Es muss sich um einen kryptografisch sicheren Hash-Algorithmus mit der spezifischen Eigenschaft handeln, dass nicht nur der Hash nicht umkehrbar ist, sondern auch rechnerisch unpraktisch, um eine andere Zeichenfolge zu generieren, die denselben Hash generiert.
Tall Jeff

11
Ja und Nein ... Hash-Kollisionen müssen aus Gründen der Sicherheit Ihrer eigenen Anwendung schwer zu generieren sein, aber die Nichtumkehrbarkeit reicht aus, um Kennwortverluste zu vermeiden.
Dave Sherohman

5
seidig: und wie genau werden Sie das ursprüngliche Passwort von Ihrer miesen Hash-Funktion zurückbekommen? Ich schlage vor, Sie lesen noch einmal Daves Kommentar
Vinko Vrsalovic

1
Wenn überhaupt, ist eine Hash-Funktion mit einer großen Anzahl von Kollisionen für die Sicherheit der Passwörter besser, dies würde jedoch offensichtlich bedeuten, dass mehr Passwörter verwendet werden könnten, um sich bei dem Konto anzumelden.
Williamvicary

1
@ n00b-Salze können nicht fest codiert werden, da für jedes gehashte Element ein separates Salz verwendet werden sollte. Der Sinn eines Salzes ist, wenn sowohl BenutzerA als auch BenutzerB das Passwort "1234" verwenden. Wenn Sie das Passwort von BenutzerA herausfinden, können Sie nicht sagen, dass BenutzerB dasselbe Passwort verwendet hat, da sie unterschiedliche Salze hatten. Es ist nicht sicherheitskritisch, dass ein Salz geheim gehalten wird. Die meisten Implementierungen verketten das Salz lediglich auf der Vorder- oder Rückseite des binären Blobs, der den Hash darstellt.
Scott Chamberlain

34

Hashing ist eine Einwegfunktion. Wenn Sie also ein Passwort gehasht haben, ist es sehr schwierig, das ursprüngliche Passwort aus dem Hash zurückzugewinnen. Die Verschlüsselung ist eine Zwei-Wege-Funktion, bei der es viel einfacher ist, den Originaltext aus dem verschlüsselten Text zurückzugewinnen.

Einfaches Hashing kann leicht mit einem Wörterbuchangriff besiegt werden, bei dem ein Angreifer jedes Wort in einem Wörterbuch (oder jede Kombination von Zeichen bis zu einer bestimmten Länge) vorab hascht und dann dieses neue Wörterbuch verwendet, um Hash-Passwörter nachzuschlagen. Die Verwendung eines eindeutigen zufälligen Salt für jedes gespeicherte Hash-Passwort erschwert es einem Angreifer erheblich, diese Methode zu verwenden. Grundsätzlich müssten sie für jeden Salzwert, den Sie verwenden, ein neues, einzigartiges Wörterbuch erstellen, das ihren Angriff erheblich verlangsamt.

Das Speichern von Passwörtern mithilfe eines Verschlüsselungsalgorithmus ist unsicher, da es für einen Angreifer auch einfacher ist, das ursprüngliche Passwort aus dem verschlüsselten Text zurückzugewinnen, wenn es für den Benutzer oder den Administrator einfacher ist, das ursprüngliche Passwort zurückzugewinnen.


12

Verschlüsselte und verwaschene Passwörter

Wie im obigen Bild gezeigt, ist das verschlüsselte Passwort immer ein verstecktes Geheimnis, in das jemand das Klartext-Passwort extrahieren kann. Wenn das Kennwort gehasht wird, sind Sie jedoch entspannt, da es kaum eine Methode gibt, das Kennwort aus dem Hashwert wiederherzustellen.


Aus verschlüsselten und gehashten Passwörtern extrahiert - Was ist besser?

Ist die Verschlüsselung gut?

Nur-Text-Passwörter können mit symmetrischen Verschlüsselungsalgorithmen wie DES, AES oder anderen Algorithmen verschlüsselt und in der Datenbank gespeichert werden. Bei der Authentifizierung (Bestätigung der Identität mit Benutzername und Kennwort) entschlüsselt die Anwendung das in der Datenbank gespeicherte verschlüsselte Kennwort und vergleicht es aus Gründen der Gleichheit mit dem vom Benutzer angegebenen Kennwort. Bei dieser Art der Kennwortbehandlung können die Kennwörter nicht einfach wiederverwendet werden, selbst wenn jemand Zugriff auf Datenbanktabellen erhält. Allerdings gibt es auch bei diesem Ansatz schlechte Nachrichten. Wenn jemand den kryptografischen Algorithmus zusammen mit dem von Ihrer Anwendung verwendeten Schlüssel erhält, kann er alle in Ihrer Datenbank gespeicherten Benutzerkennwörter durch Entschlüsselung anzeigen. "Dies ist die beste Option, die ich bekommen habe", mag ein Softwareentwickler schreien, aber gibt es einen besseren Weg?

Kryptografische Hash-Funktion (nur in eine Richtung)

Ja, vielleicht haben Sie den Punkt hier verpasst. Haben Sie bemerkt, dass es nicht erforderlich ist, zu entschlüsseln und zu vergleichen? Wenn es einen Einweg-Konvertierungsansatz gibt, bei dem das Kennwort in ein konvertiertes Wort konvertiert werden kann, die umgekehrte Operation (Generierung des Kennworts aus konvertiertem Wort) jedoch nicht möglich ist. Selbst wenn jemand Zugriff auf die Datenbank erhält, gibt es keine Möglichkeit, die Passwörter mithilfe der konvertierten Wörter zu reproduzieren oder zu extrahieren. Bei diesem Ansatz wird es sowieso kaum möglich sein, dass einige die streng geheimen Passwörter Ihrer Benutzer kennen. Dadurch werden die Benutzer geschützt, die in mehreren Anwendungen dasselbe Kennwort verwenden. Welche Algorithmen können für diesen Ansatz verwendet werden?


Okay, aber wenn Sie sich bei einem Dienst anmelden, wird Ihr Passwort im Klartext / verschlüsselt gesendet, da es als Hash an den zu vergleichenden Server gesendet wird. Ein Hacker könnte, wenn er den Hash kennt, den Hash einfach an den Server senden, um sich anzumelden. Aus diesem Grund müssen Kennwörter zum Vergleich verschlüsselt an den Server gesendet werden, wo sie entschlüsselt und gehasht werden. Das ist sicher, oder? Solange die Passwörter niemals langfristig in unverhohlener Form gespeichert werden und alle Vorkommen von verschlüsselten / Klartext-Passwörtern aus einem Speicher gelöscht werden, wenn sie nicht mehr benötigt werden?
AgentM

8

Ich habe immer gedacht, dass die Verschlüsselung in beide Richtungen konvertiert werden kann, sodass der Endwert Sie zum ursprünglichen Wert bringt und Sie mit Hashing nicht vom Endergebnis zum ursprünglichen Wert zurückkehren können.


8

Hashing-Algorithmen sind normalerweise kryptografischer Natur, aber der Hauptunterschied besteht darin, dass die Verschlüsselung durch Entschlüsselung reversibel ist und das Hashing nicht.

Eine Verschlüsselungsfunktion nimmt normalerweise Eingaben entgegen und erzeugt verschlüsselte Ausgaben, die gleich oder etwas größer sind.

Eine Hashing-Funktion nimmt Eingaben entgegen und erzeugt eine typischerweise kleinere Ausgabe, typischerweise auch von fester Größe.

Während es nicht möglich ist, ein Hash-Ergebnis zu nehmen und es zu "dehash", um die ursprüngliche Eingabe wiederherzustellen, können Sie sich normalerweise brutal zu etwas zwingen, das denselben Hash erzeugt.

Mit anderen Worten, wenn ein Authentifizierungsschema ein Kennwort nimmt, es hasht und mit einer gehashten Version des erforderlichen Kennworts vergleicht, ist es möglicherweise nicht erforderlich, dass Sie das ursprüngliche Kennwort kennen, nur dessen Hash, und Sie können Brute-Force durchführen Ihr Weg zu etwas, das passt, auch wenn es ein anderes Passwort ist.

Hashing-Funktionen werden normalerweise erstellt, um das Risiko von Kollisionen zu minimieren und es schwierig zu machen, nur etwas zu berechnen, das den gleichen Hash wie etwas anderes erzeugt.


4

Idealerweise sollten Sie beides tun.

Hash das Pass-Passwort für die Einweg-Sicherheit. Verwenden Sie ein Salz für zusätzliche Sicherheit.

Verschlüsseln Sie dann den Hash, um sich gegen Wörterbuchangriffe zu schützen, wenn Ihre Datenbank mit Kennwort-Hashes gefährdet ist.


3
Mit was verschlüsseln? Wenn sie Sie so hart pwned haben, dass sie mit allen Passwörtern Ihres Benutzers (gehasht, verschlüsselt oder auf andere Weise) in die Datenbank gelangt sind, könnten sie dann nicht den Schlüssel finden, um sie zu entschlüsseln?
Luc

5
Dies sollte nicht herabgestuft werden. Es ist eine Möglichkeit, die nicht so einfach ausgeschlossen werden sollte, dass die Datenbank kompromittiert wird, während die Anwendung dies nicht ist. Daher ist das Verschlüsseln des Hashs eine zusätzliche Sicherheitsebene.
Arie

@ Luc Ich bin nicht einverstanden mit dir, meinem vorherigen Ich. Ich habe zu viele SQL-Injektionen gesehen, die den Anwendungscode (oder die Konfigurationsdateien) nicht beeinträchtigt haben, und bin jetzt der Meinung, dass das Hinzufügen eines Geheimnisses hilfreich ist, sei es in Form einer Verschlüsselung oder in Form eines Pfeffers. Es darf jedoch kein Hashing ersetzen . Eine vollständigere Antwort finden Sie hier: security.stackexchange.com/a/31846/10863
Luc

3

Hashing :

Es ist ein Einweg-Algorithmus und kann nach dem Hashing nicht mehr zurückgesetzt werden. Dies ist der Sweet Point gegen Verschlüsselung.

Verschlüsselung

Wenn wir eine Verschlüsselung durchführen, gibt es dafür einen Schlüssel. Wenn dieser Schlüssel durchgesickert ist, können alle Ihre Passwörter leicht entschlüsselt werden.

Auf der anderen Seite kann der Hacker diese Hash-Passwörter nicht brechen, selbst wenn Ihre Datenbank gehackt wird oder Ihr Serveradministrator Daten aus der Datenbank übernommen hat und Sie Hash-Passwörter verwendet haben. Dies wäre tatsächlich praktisch unmöglich, wenn wir Hashing mit geeignetem Salz und zusätzlicher Sicherheit mit PBKDF2 verwenden.

Wenn Sie sich ansehen möchten, wie Sie Ihre Hash-Funktionen schreiben sollen, können Sie diese hier besuchen .

Es gibt viele Algorithmen, um Hashing durchzuführen.

  1. MD5 - Verwendet die Hash-Funktion des Message Digest-Algorithmus 5 (MD5). Der Ausgabe-Hash ist 128 Bit lang. Der MD5-Algorithmus wurde Anfang der 90er Jahre von Ron Rivest entwickelt und ist heute keine bevorzugte Option.

  2. SHA1 - Verwendet den 1995 veröffentlichten Hash des Security Hash Algorithm (SHA1). Der Ausgabe-Hash ist 160 Bit lang. Obwohl am weitesten verbreitet, ist dies heute keine bevorzugte Option.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - Verwenden Sie die Funktionen SHA-256, SHA-384 und SHA-512 der SHA-2-Familie. SHA-2 wurde 2001 veröffentlicht. Die Ausgabe-Hash-Längen betragen 256, 384 bzw. 512 Bit, wie die Namen der Hash-Funktionen angeben.


1

So richtig die anderen Antworten auch sein mögen, in dem Kontext, in dem sich das Zitat befand, ist Hashing ein Werkzeug, das zum Sichern von Informationen verwendet werden kann. Verschlüsselung ist ein Prozess, der Informationen aufnimmt und das Lesen / Verwenden für Unbefugte sehr schwierig macht.


-9

Hier ist ein Grund, warum Sie einen über den anderen verwenden möchten - das Abrufen von Passwörtern.

Wenn Sie nur einen Hash des Passworts eines Benutzers speichern, können Sie keine Funktion zum Vergessen des Passworts anbieten.


16
Sie haben die akzeptierte Antwort offensichtlich nicht gut genug gelesen. Lesen Sie sorgfältig: Sie sollten keine Funktion zum Abrufen von Passwörtern anbieten . Sie sollten eine Funktion zum Zurücksetzen des Passworts anbieten . Ich habe jahrelang viele Websites verwaltet, darunter vBulletin, phpBB, e107, IPB, Blogspot und sogar mein eigenes CMS. Als Administrator müssen Sie NIEMALS das vorab gehashte Passwort einer Person haben. Das tust du einfach nicht. Und du solltest es auch nicht haben. Wenn Sie mit dem, was ich sage, nicht einverstanden sind, versichere ich Ihnen: Sie liegen falsch.
Lakey

3
Tut mir leid, dass ich viel zu wütend bin. Ich sehe einfach zu viele Websites, auf denen Passwörter im Klartext gespeichert sind, und das frustriert mich. Als Randnotiz: Einige sicherheitsbewusste Websites lassen Benutzer ihre Passwörter regelmäßig ändern. Sie möchten sicherstellen, dass die Person ihr Passwort nicht von "Passwort1" in "Passwort2" ändert. Sie behalten also das Klartextkennwort bei, um diese Vergleiche zu einem späteren Zeitpunkt durchführen zu können. Das ist keine gute Praxis. In diesem Fall müssen sie ZUERST eine Analyse des Kennworts durchführen, eine Reihe ähnlicher Kennwörter erstellen - jeweils ein Hash - und nur die Hashes speichern .
Lakey

7
Kein Problem, es hat mich dazu gebracht, die Frage noch einmal zu lesen und weitere Nachforschungen anzustellen, damit nicht alles verloren geht :-) Ich bin mir nicht sicher, was ich dachte, als ich diese Antwort schrieb. Prost
Philtron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.