2008-09-12 3 views
6

Wir speichern derzeit Klartext-Passwörter für eine Web-App, die wir haben.Ersetzen von Nur-Text-Passwort für App

Ich befürworte die Umstellung auf einen Passwort-Hash, aber ein anderer Entwickler sagte, dass dies weniger sicher wäre - mehr Passwörter könnten dem Hash entsprechen und ein Wörterbuch/Hash-Angriff wäre schneller.

Gibt es eine Wahrheit zu diesem Argument?

Antwort

15

Absolut keine. Aber das macht nichts. Ich habe eine ähnliche Antwort geschrieben:

Es ist bedauerlich, aber Menschen, sogar Programmierer, sind einfach zu emotional, um leicht durch Argumente beeinflusst werden. Sobald er in seine Position investiert hat (und, wenn du hier schreibst, er ist), wirst du ihn wahrscheinlich nicht nur mit Fakten überzeugen. Was Sie tun müssen, ist die Beweislast zu wechseln. Du musst ihn auf die Suche nach Daten bringen, von denen er hofft, dass sie dich überzeugen, und dabei die Wahrheit erfahren. Leider hat er den Status Quo, also hast du einen harten Weg dorthin.

+0

guten Fang dort - es ist wirklich eine emotionale Reaktion von der OP-Mitarbeiter. Das Ansprechen der warmen Fuzzys wird wahrscheinlich produktiver sein als die harte Logik und die Metriken. Vielleicht die hashing algo Wahl auf den Kollegen schieben, damit sie mehr zur richtigen Lösung kaufen? –

+0

Sie haben hier einen sehr guten Punkt. Ich habe in der Frage nicht erwähnt, aber das war sein Code - er hat es auf diese Weise implimenemented. Es ist jetzt mein Code, also könnte ich es unilaterly ändern, aber ich würde es ihm lieber erlauben, Gesicht zu speichern/zustimmen, falls ich weitere Hilfe brauche, um den Code zu verstehen ... –

1

Ich bin kein Sicherheitsexperte, aber ich habe das Gefühl, dass, wenn reiner Text sicherer wäre, würde Hashing überhaupt nicht existieren.

+1

-1: Hashing für viel mehr als Passwörter verwendet wird. Und nur weil etwas existiert, bedeutet es nicht, dass es irgendeinen Wert hat (obwohl es in diesem Fall ist). Eine echte Erklärung hätte einen Mehrwert. –

5

Es gibt absolut keine Entschuldigung, Klartext-Passwörter in der Web-App zu halten. Verwenden Sie einen Standard-Hashing-Algorithmus (SHA-1, nicht MD5!) Mit einem Salt-Wert, so dass Rainbow-Angriffe unmöglich sind.

+0

MD5 ist völlig ungeeignet für Passwort Hashes –

+0

Ich habe die Antwort aktualisiert, danke @ Joel-Coehoorn. – qbeuek

3

Wenn Sie nicht Salz Ihr Passwort zu tun, sind Sie vermuten, dass Rainbow Table-Angriffe (vorkompilierte Wörterbücher, die gültige Eingaben für einen bestimmten Hash haben)

Der andere Entwickler sollte reden über Sicherheit stoppen, wenn Sie speichern Passwörter sind im Klartext und lesen Sie über Sicherheit.

Kollisionen sind möglich, aber normalerweise kein großes Problem für Passwort-Apps (sie sind hauptsächlich ein Problem in Bereichen, in denen Hashes zur Überprüfung der Integrität von Dateien verwendet werden).

Also: Salzen Sie Ihre Passwörter (indem Sie das Salt auf der rechten Seite des Passworts *) und verwenden Sie einen guten Hash-Algorithmus wie SHA-1 oder vorzugsweise SHA-256 oder SHA-512.

PS: Ein bisschen mehr Details über Hashes here.

* Ich bin mir nicht sicher, ob das Salz bis zum Anfang oder bis zum Ende der Saite soll. Das Problem ist, dass wenn Sie eine Kollision haben (zwei Eingaben mit dem gleichen Hash), das Hinzufügen des Salt zur "falschen" Seite den resultierenden Hash nicht ändern wird. In jedem Fall werden Sie keine großen Probleme mit Rainbow Tables haben, nur mit Kollisionen

3

Ich verstehe nicht, wie Ihre anderen Entwickler Dinge 'mehr Passwörter den Hash' übereinstimmen könnte.

Es gibt ein Argument für einen "Hash-Angriff wäre schneller", aber nur, wenn Sie die Passwörter nicht gesalzen haben, da sie Hashes sind. Normalerweise ermöglichen Hashing-Funktionen die Bereitstellung eines Salzes, wodurch die Verwendung der bekannten Hash-Tabelle Zeitverschwendung ist.

Persönlich würde ich "Nein" sagen. Basierend auf dem Obigen, sowie der Tatsache, dass, wenn Sie irgendwie Klartext-Expose erhalten, ein gesalzener Hash-Wert von geringem Wert für jemanden ist, der versucht hineinzukommen. Hashing bietet auch den Vorteil, dass alle Passwörter "aussehen" die gleiche Länge.

dh, wenn das Hashing eines Strings immer einen 20-stelligen Hashwert zur Folge hat, können Sie nicht feststellen, ob das ursprüngliche Passwort acht Zeichen oder sechzehn Zeichen hatte.

1

In der Theorie ja. Passwörter können länger sein (mehr Informationen) als ein Hash, also besteht die Möglichkeit von Hash-Kollisionen. Die meisten Angriffe sind jedoch wörterbuchbasiert und die Wahrscheinlichkeit von Kollisionen ist unendlich kleiner als eine erfolgreiche direkte Übereinstimmung.

0

mehr Passwörter könnten dem Hash entsprechen und ein Wörterbuch/Hash-Angriff wäre schneller.

Ja und nein. Verwenden Sie einen modernen Hash-Algorithmus, wie eine SHA-Variante, und dieses Argument wird sehr, sehr Woche. Müssen Sie sich wirklich Sorgen machen, wenn dieser Brute-Force-Angriff nur 352 statt 467 Jahre dauern wird? (Anekdotischer Witz dort.) Der zu erzielende Wert (ohne das Passwort im Klartext auf dem System gespeichert zu haben) übersteigt bei weitem das Anliegen Ihres Kollegen.

6

Von Wikipedia

Einige Computersysteme speichern Benutzer Passwörter, gegen die Benutzer-Einlog-Versuch zu vergleichen, da unverschlüsselt. Wenn ein Angreifer Zugang zu einem solchen internen Passwortspeicher erhält, werden alle Passwörter und so alle Benutzerkonten kompromittiert. Wenn einige Benutzer das gleiche Kennwort für Konten auf verschiedenen Systemen verwenden, werden diese auch kompromittiert.

Sicherere Systeme speichern jedes Passwort in einer kryptografisch geschützten Form vorliegen, so Zugriff auf das eigentliche Passwort noch schwierig für einen Schnüffler sein wird, den internen Zugriff auf das System erlangt, während Validierung von Benutzerzugriffsversuchen bleibt möglich.

Ein allgemeiner Zugriff speichert nur eine "Hash" -Form des Klartext Passwort. Wenn ein Benutzer in einem Passwort auf einem solchen System, das Passwort Handling-Software läuft durch einen verschlüsselten Hash Algorithmus, und wenn der Hash-Wert aus den Eintrag des Benutzers generiert entspricht dem gespeicherten Hash in der Passwort-Datenbank, die Benutzer ist Zugriff erlaubt. Der Hash-Wert ist erstellt durch Anwendung einer kryptografischen Hash-Funktion auf eine Zeichenfolge, bestehend aus des übergebenen Passwort und in der Regel ein anderer Wert als Salz bekannt. Das Salz verhindert Angreifer von Aufbau einer Liste von Hash-Werten für gemeinsame Passwörter. MD5 und SHA1 sind häufig verwendete kryptografische Hash-Funktionen Funktionen.

Es gibt viel mehr, dass Sie zu dem Thema auf dieser Seite lesen können. Meiner Meinung nach und in allem, was ich gelesen habe und mit denen ich gearbeitet habe, ist Hashing ein besseres Szenario, es sei denn, Sie verwenden einen sehr kleinen (< 256 Bit) Algorithmus.

2

Es gibt die Wahrheit darin, dass, wenn Sie etwas hacken, ja, es wird Kollisionen geben, so dass es für zwei verschiedene Passwörter möglich wäre, das gleiche Konto zu entsperren. Ein praktisches Argument ist allerdings - eine gute Hashing-Funktion (md5 oder sha1 wäre in Ordnung) kann ziemlich gut garantieren, dass es bei allen sinnvollen Strings, besonders kurzen Strings, keine Kollisionen geben wird. Selbst wenn es zwei Passwörter für einen Account gäbe, wäre das kein großes Problem - Wenn jemand in der Lage ist, Passwörter so schnell zu erraten, dass sie wahrscheinlich einsteigen können, dann haben Sie größere Probleme.

Ich würde argumentieren, dass das Speichern der Passwörter im Klartext ein viel größeres Sicherheitsrisiko darstellt als Hash-Kollisionen in der Passwortabfrage.

+1

MD5 ist _never_ in Ordnung. – SLaks

+0

@SLaks: md5, so kaputt wie es ist, ist immer noch besser als das Speichern von Klartextpasswörtern. –

1

Es hängt davon ab, gegen was Sie sich verteidigen. Wenn ein Angreifer Ihre Datenbank herunterzieht (oder Ihre Anwendung dazu bringt, die Datenbank anzuzeigen), sind Klartextpasswörter nutzlos. Es gibt viele Angriffe, die darauf angewiesen sind, die Anwendung davon zu überzeugen, ihre privaten Daten auszusprechen - SQL-Injection, Session-Hijack, usw. Es ist oft besser, die Daten nicht zu behalten, sondern die Hash-Version so schlecht zu halten, dass sie nicht einfach verwendet werden kann .

Wie Ihr Kollege vorschlägt, kann dies trivialerweise dadurch verhindert werden, dass der gleiche Hash-Algorithmus für ein Wörterbuch ausgeführt wird und mithilfe von Rainbow-Tabellen die Informationen abgerufen werden. Die übliche Lösung ist ein Geheimnis Salz plus zusätzliche Benutzerinformationen verwenden, um die Hash-Ergebnisse unique- so etwas wie zu machen:

String hashedPass=CryptUtils.MD5("alsdl;ksahglhkjfsdkjhkjhkfsdlsdf" + user.getCreateDate().toString() + user.getPassword); 

Solange Ihr Salz ist geheim, oder der Angreifer kennt nicht das genaue Erstellungsdatum Nach der Aufzeichnung des Benutzers wird ein Wörterbuchangriff fehlschlagen, auch wenn sie das Passwortfeld löschen können.

+0

Was? Wenn der Angreifer Ihre "users" -Tabelle hat, wird er das CreationDate der Benutzer haben. Wenn CreationDate nicht in der Tabelle "users" enthalten ist, wie werden die Anmeldungen der Anwendung verarbeitet? Salzen mit Daten für jeden Benutzer ist eine gute Idee, aber es ist auch ein gegeben, dass Angreifer Zugriff darauf haben. Der entscheidende Punkt dabei ist, dass Angreifer separate Rainbow-Tabellen für jeden einzelnen Benutzer erstellen müssen. Und hier kommen langsame Hash-Algos ins Spiel. – Shinhan

+2

Das Salz muss nicht geheim sein, und es sollte nicht für jeden Benutzer gleich sein. Dann kann eine Regenbogen-Tabelle mit diesem Salz erzeugt werden. Stattdessen sollte jeder Benutzer ein zufällig generiertes Salz haben. Es muss nicht so geheim sein. Sie können es veröffentlichen, wenn Sie wollten. Der Punkt ist, dass ein gesamter Regenbogenangriff nur gegen maximal einen Benutzer gleichzeitig wirksam wäre. – ZaBlanc

+0

S/oft/immer /. Und md5 für den Beispielcode? Zum Schämen –

3

Ich stieß auf genau dieses Problem an meinem Arbeitsplatz. Was ich getan habe, um ihn davon zu überzeugen, dass Hashing sicherer ist, war das Schreiben einer SQL-Injection, die die Liste der Benutzer und Passwörter aus dem öffentlichen Bereich unserer Site zurückgibt. Es wurde als ein wichtiges Sicherheitsproblem eskaliert sofort :)

Um zu verhindern, gegen Wörterbuch/Hash-Angriffe sicher sein, gegen einen Token Hash, die jeden Benutzer eindeutig ist und statisch (Benutzername/join Datums/userguid funktioniert gut)

1

Nichts ist sicherer als das Speichern von Nur-Text-Passwörtern. Wenn Sie einen anständigen Hash-Algorithmus verwenden (mindestens SHA-256, aber sogar SHA-1 ist besser als nichts), dann sind ja Kollisionen möglich, aber das spielt keine Rolle, da es bei einem Hash unmöglich ist, was zu berechnen Zeichenketten Hash zu ihm. Wenn Sie den Benutzernamen mit dem Passwort hashen, dann wird diese Möglichkeit ebenfalls ausgeblendet.

* - technisch nicht unmöglich, aber „rechnerisch unmöglich“

Wenn der Benutzername „graeme“ und das Passwort „Stackoverflow“, dann eine Zeichenfolge „graeme-Stackoverflow-1234“ erstellen, in dem 1234 ein zufällig Nummer, dann Hash es und speichern "Hashoutput 1234" in der Datenbank. Wenn es darum geht, ein Passwort zu validieren, nimm den Benutzernamen, das angegebene Passwort und die Nummer vom Ende des gespeicherten Wertes (der Hash hat eine feste Länge, damit du das immer tun kannst) und hasse sie zusammen und vergleiche sie mit dem Hash Teil des gespeicherten Wertes.

3

Es gibt ein altes Sprichwort über Programmierer entcoders :)

Jeff Atwood hat einen guten Beitrag zu diesem Thema zu sein vorgibt: You're Probably Storing Passwords Incorrectly

ausführlicher zu antworten, bin ich mit allen oben genannten, die Hash macht es einfacher in der Theorie, um das Passwort des Benutzers zu erhalten, da mehrere Passwörter den gleichen Hash übereinstimmen. Dies passiert jedoch viel seltener als jemand, der Zugriff auf Ihre Datenbank erhält.