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?
Antworten:
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.
quelle
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.
quelle
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?
quelle
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.
quelle
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.
quelle
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.
quelle
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.
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.
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.
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.
quelle
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.
quelle
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.
quelle