web-dev-qa-db-de.com

Unterschied zwischen dem Hashing und dem Verschlüsseln eines Passworts

Die aktuelle Top-Bewertung zu diese Frage lautet:

Ein anderes, weniger sicherheitsrelevantes Problem, ist vollständig und kann den Unterschied zwischen dem Hashing eines Kennworts und dem Verschlüsseln des Kennworts nicht erkennen . Am häufigsten in Code gefunden, in dem der Programmierer versucht, unsichere "Erinnere mich an mein Passwort" -Funktionalität bereitzustellen.

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

124
Claudiu

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 mit einem Rainbow table angreifen, dem Sie entgegenwirken können, indem Sie vor dem Speichern ein salt auf den Hash anwenden.

Das Verschlüsseln ist eine ordnungsgemäße (bidirektionale) Funktion. Es ist reversibel. Sie können die entschlüsselte 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 der Schlüssel in Ihrer Anwendung gespeichert ist und ein Angreifer, der Zugriff auf Ihre Datenbank (und/oder Ihren 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, dass ein Cracker, der Ihre Datenbank oder Ihren Code besitzt, kein Passwort benötigt, daher ist der Unterschied umstritten. Das ist naiv, weil 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 höheren Risiko ausgesetzt sind, indem sie ihre Passwörter verlieren.

201
Vinko Vrsalovic

Hashing ist eine Einwegfunktion, was bedeutet, dass es sehr schwierig ist, das ursprüngliche Passwort aus dem Hash zurückzugewinnen, wenn Sie ein Passwort einmal gehackt haben. Die Verschlüsselung ist eine bidirektionale Funktion, bei der es viel einfacher ist, den Originaltext aus dem verschlüsselten Text wiederherzustellen.

Normales Hashing kann mit einem Wörterbuchangriff leicht besiegt werden, bei dem ein Angreifer nur jedes Wort in einem Wörterbuch (oder jede Kombination von Zeichen bis zu einer bestimmten Länge) vorab hascht und dann mit diesem neuen Wörterbuch gehashte Kennwörter nachschlägt. Die Verwendung eines eindeutigen zufälligen Salt für jedes gespeicherte Hash-Passwort erschwert einem Angreifer die Verwendung dieser Methode erheblich. Sie müssten im Grunde genommen für jeden Salzwert, den Sie verwenden, ein neues, einzigartiges Wörterbuch erstellen, das ihren Angriff fürchterlich verlangsamt.

Das Speichern von Kennwörtern mit einem Verschlüsselungsalgorithmus ist nicht sicher, da ein Angreifer das gleiche leichter tun kann, wenn es für den Benutzer oder den Administrator einfacher ist, das ursprüngliche Kennwort aus dem verschlüsselten Text wiederherzustellen.

31
Bill the Lizard

Encrypted vs Hashed Passwords

Wie in der obigen Abbildung gezeigt, ist das verschlüsselte Kennwort immer ein verborgenes Geheimnis, in dem jemand das Klartextkennwort extrahieren kann. Wenn jedoch ein Passwort gehasht wird, sind Sie entspannt, da es kaum eine Möglichkeit gibt, das Passwort aus dem Hash-Wert wiederherzustellen.


Extrahiert aus verschlüsselte vs Hash-Passwörter - Was ist besser?

Ist die Verschlüsselung gut?

Klartext-Passwörter können mit symmetrischen Verschlüsselungsalgorithmen wie DES, AES oder mit 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 mit dem vom Benutzer angegebenen Kennwort, um die Gleichheit zu gewährleisten. Selbst wenn bei dieser Art der Kennwortverarbeitung jemand Zugriff auf Datenbanktabellen erhält, können die Kennwörter nicht einfach wiederverwendet werden. Allerdings gibt es auch in diesem Ansatz eine schlechte Nachricht. 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 entschlüsseln. "Das ist die beste Option, die ich bekommen habe", schreit ein Softwareentwickler vielleicht, aber gibt es einen besseren Weg?

Kryptografische Hash-Funktion (nur in eine Richtung)

Ja, vielleicht haben Sie den Punkt hier verpasst. Ist Ihnen aufgefallen, dass keine Notwendigkeit zum Entschlüsseln und Vergleichen besteht? Wenn es einen Einweg-Konvertierungsansatz gibt, bei dem das Kennwort in ein konvertiertes Wort konvertiert werden kann, der umgekehrte Vorgang (Generieren des Kennworts aus konvertiertem Wort) jedoch nicht möglich ist. Selbst wenn jemand Zugriff auf die Datenbank erhält, können die Passwörter nicht mehr mit den konvertierten Wörtern reproduziert oder extrahiert werden. Bei diesem Ansatz wird es kaum jemanden geben, der die streng geheimen Passwörter Ihrer Benutzer kennt. Dadurch werden die Benutzer geschützt, die in mehreren Anwendungen dasselbe Kennwort verwenden. Welche Algorithmen können für diesen Ansatz verwendet werden?

12
lkamal

Ich habe immer gedacht, dass die Verschlüsselung auf beide Arten konvertiert werden kann, sodass der Endwert Sie zum ursprünglichen Wert bringt und Sie mit Hashing nicht in der Lage sind, vom Endergebnis zum ursprünglichen Wert zurückzukehren.

8
CheGueVerra

Hashing-Algorithmen sind in der Regel kryptografischer Natur, der Hauptunterschied besteht jedoch darin, dass die Verschlüsselung durch Entschlüsselung umkehrbar ist und das Hashing nicht.

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

Eine Hash-Funktion nimmt Eingaben entgegen und erzeugt eine typischerweise kleinere Ausgabe, typischerweise auch mit einer festen Größe.

Während es nicht möglich ist, ein Hash-Ergebnis zu nehmen und es zu "enthaupten", um die ursprüngliche Eingabe wiederherzustellen, können Sie Ihren Weg zu etwas brachial erzwingen, das denselben Hash erzeugt.

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

Hashing-Funktionen werden in der Regel erstellt, um die Wahrscheinlichkeit von Kollisionen zu minimieren und es schwierig zu machen, nur etwas zu berechnen, das denselben Hash wie etwas anderes erzeugt.

Hashing :

Es ist ein One-Way-Algorithmus und einmal gehasht kann nicht zurückgesetzt werden und dies ist der Sweet Point gegen Verschlüsselung.

Verschlüsselung

Wenn wir verschlüsseln, gibt es einen Schlüssel dafür. Wenn dieser Schlüssel durchgesickert ist, können alle Ihre Passwörter leicht entschlüsselt werden.

Auf der anderen Seite kann der Hacker diese gehackten Passwörter auch dann nicht knacken, wenn Ihre Datenbank gehackt wird oder Ihr Serveradministrator Daten von der Datenbank abgerufen hat und Sie Hash-Passwörter verwendet haben. Dies wäre praktisch unmöglich, wenn wir mit PBKDF2 Hashing mit angemessenem Salz und zusätzlicher Sicherheit verwenden.

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

Es gibt viele Algorithmen zum Durchführen von Hashing.

  1. MD5 - Verwendet die Hash-Funktion Message Digest Algorithm 5 (MD5). Der Ausgabehash hat eine Länge von 128 Bit. Der MD5-Algorithmus wurde Anfang der neunziger Jahre von Ron Rivest entwickelt und ist heute keine bevorzugte Option.

  2. SHA1 - Verwendet den 1995 veröffentlichten Hash des Sicherheits-Hash-Algorithmus (SHA1). Der Ausgabe-Hash hat eine Länge von 160 Bit. 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 ausgegebenen Hash-Längen betragen 256, 384 bzw. 512 Bit, wie die Namen der Hash-Funktionen angeben.

3
Rahul Garg

Idealerweise sollten Sie beides tun.

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

Verschlüsseln Sie dann den Hash, um sich vor Wörterbuchangriffen zu schützen, wenn Ihre Datenbank mit Kennwort-Hashes kompromittiert ist.

3
LogicMagic

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

1
Peter Coulton