Web Application - Speichern eines Passworts

8

Habe ich etwas verpasst? Gibt es zusätzliche Schritte, um Passwörter in der DB zu speichern?

Speichern des Passworts:
Nach so viel Forschung zu diesem Thema bin ich zu dem Schluss gekommen, dass der beste Weg, um Benutzerpasswörter in einer Webanwendungs-DB (in meinem Fall MySQL + PHP) zu speichern, wie folgt lautet:

  • Weisen Sie ein standortweites statisches Salz zu. (16 Randzeichen inkl. 0-9, a-z, A-Z, [] / * - ')
  • Ordnen Sie einem Benutzer eine zufällige Salzmenge zu (gespeichert in der DB).
  • Speichern Sie das Ergebnis hash_function ($ userPassword + $ sitewideSalt + $ randomSalt)
  • Speichern Sie $ randomSalt neben dem resultierenden Hash.
  • Verwenden Sie eine regulierbare Arbeitslast von bcrypt Hashing
  • Angriff # 1: Der Angreifer gibt die Datenbank per SQL-Injection aus.
    DB Ergebnisse von unsere hash_function und das zufällige per Benutzersalz.

    Nach der Müllkippe könnte der Angreifer Erhalten Sie $ userPassword und $ randomSalt durch Nachschlagen in seinem eigenen Konto. Dann raten wir den Hash Funktion wie MD5 konnte er eine starten Regenbogen Angriff auf die $ sitewideSalt Aber das könnte bis zu 1,41 hundert Millionen betragen Jahrhunderte [1].

    Bei Verwendung dieses Sicherheitstyps verhindert , dass ein Speicherauszug der Datenbank gespeicherte Kennwörter beeinträchtigt . Der Benutzer muss $ sitewideSalt weiterhin über eine andere Methode finden.

  • Angriff # 2: Der Angreifer findet einen LFI-Vektor (Local File Inclusion).
    Angreifer könnte den Rohcode für unsere Webanwendung erhalten       Nach dem Ausnutzen der Web-Anwendung durch eine mögliche LFI oder RFI [2] liest der Angreifer die Quellcode für unser Web Anwendung und erhält unser einfaches Algorithmus und das gespeicherte $ sitewideSalt .


Wohin mit dem nächsten?
Nun hat der Angreifer beide Salze, mit denen er beginnen kann, um die tatsächlichen Passwörter zu erhalten. Allerdings muss er für jeden -Benutzer eine Rainbow-Tabelle erstellen, da jeder Benutzer ein anderes zufälliges benutzerspezifisches Salz ($ randomSalt) hat.

  

"Ein moderner Server kann den MD5 berechnen   Hash von etwa 330 MB pro Sekunde. Ob   Ihre Benutzer haben Passwörter, die sind   Kleinbuchstaben, alphanumerisch und 6   Zeichen lang, können Sie jeden versuchen   einzelnes mögliches Kennwort dieser Größe   in ca. 40 Sekunden. "
" ... CUDA, du kannst deinen eigenen kleinen Supercomputer-Cluster zusammenstellen, mit dem du pro Sekunde rund 700.000.000 Passwörter ausprobieren kannst ... "[3]

Was wir jetzt tun müssen, ist die Hashing-Funktion mit einem zeitaufwendigen Algorithmus wie bcrypt zu erweitern. Der Arbeitslastfaktor von bcrypt kann 5-6 Größenordnungen größer sein als der der einfacheren Hashing-Funktionen. Das Cracken nur eines Kennworts kann Jahre statt Minuten dauern. Und als Bonus erzeugt bcrypt bereits einen zufälligen Salt für jeden Hash und speichert ihn im resultierenden Hash.

  1. Ссылка
  2. Ссылка
davidg 24.06.2011, 07:21
quelle

2 Antworten

3

Gute Arbeit! Sieht für mich sehr vollständig aus.

Ich hätte nur folgende Vorschläge:

Drehen Sie den Servicesalz.

Entwerfen Sie eine Methode, um das salzhaltige Salz regelmäßig zu rotieren und regelmäßig auszuüben.

Wenn Sie beispielsweise ein neues Service-Salz generiert haben, verwenden Sie es für alle neuen Konten & amp; Jedes Passwort ändert sich. Wenn ein vorhandener Benutzer versucht, sich anzumelden, authentifizieren Sie ihn mit dem alten Service-Salz. Wenn dies erfolgreich ist, aktualisieren Sie ihren Hash mit dem neuen Service-Salz (und optional einem neuen benutzerspezifischen Salz). Für Benutzer, die sich nicht "irgendwann" anmelden, generieren Sie zufällig ein neues Passwort in ihrem Namen. Dadurch wird die Sicherheit für Benutzer aufrechterhalten, die Ihre Site verlassen haben, und die Benutzer, die zurückkehren, dazu gezwungen, die Funktionen zum Zurücksetzen von Kennwörtern zu verwenden. ('einige Zeit' = in welcher Periode auch immer Sie sich wohl fühlen).

Codieren Sie Ihre Servicesalz nicht fest.

Lassen Sie keinen LFI-Angriff Ihr Service-Salz beeinträchtigen. Füttern Sie das Service-Salz beim Start in Ihre Anwendung und behalten Sie es im Speicher. Um das Service-Salz zu kompromittieren, müsste ein Angreifer in der Lage sein, Code auszuführen, um das Salz aus dem Speicher zu lesen. Wenn ein Angreifer das kann, ist man sowieso ziemlich abgespritzt. =)

Verwende einen Benutzer nicht als Salz.

Suchen Sie nach Möglichkeiten, um Benutzern neue Salze zu geben. Benutzer ändert sein Passwort? Generiere ein neues zufälliges Salz. Dies wiederum bremst die Brute zwingt Ihr serversweites Salz, sollte ein Angreifer in der Lage sein, seinen Hash zu erhalten, wann immer ihm danach ist. Verbinden Sie dies mit regelmäßigem Drehen Ihres Service-Salzes, und ich wette, Sie haben eine starke Abschreckung gegen Brute-Forcing.

(Markieren Sie dies als ein Community-Wiki, sollten andere zusätzliche Ideen haben).

    
Tails 26.06.2011, 03:14
quelle
1

Die Verwendung von BCrypt zur Handhabung von Passwörtern ist der einzige Schritt oder umfasst vielmehr Folgendes:

  1. Übernehmen Sie das Passwort und stellen Sie es der BCrypt-Bibliothek zur Verfügung.
  2. Speichere den resultierenden Hash.
  3. Passwort mit Hash vergleichen.

Sie haben auch diesen Link vergessen: Ссылка , auf das Sie mit dem Zitat verweisen.

    
krainboltgreene 24.06.2011 11:19
quelle

Tags und Links