2010-03-31 1 views
18

Angesichts der bekannten Schwächen von MD5 und der jüngsten (Mai 2009) Schwächen, die in SHA1 diskutiert wurden, wie sollten neue Programme gesalzen werden & Hashing ihre Passwörter?Was ist der empfohlene Hash-Algorithmus für gespeicherte Passwörter?

Ich habe SHA-256 und SHA-512 vorgeschlagen.

Programmierung überwiegend in Ruby on Rails und mit PostgreSQL - aber andere Sprachen und Umgebungen müssen möglicherweise auch Passwort Hashes berechnen.

+2

Dank Martin, ich verstehe das. Es war eine knappe Frage und verdient eine enge Antwort. – Hissohathair

Antwort

21

SHA-256 und SHA-512 sind in absehbarer Zukunft sicher. Sie gehören zur SHA-2-Familie, gegen die bisher keine Angriffe identifiziert wurden. This wikipedia page sagt, dass Unix- und Linux-Hersteller gerade zu SHA-2 wechseln, um Passwörter sicher zu hashen. Die SHA-3-Familie mit noch stärkeren Algorithmen wird entwickelt, ist aber erst ab 2012 einsatzbereit.

P.S: Sofern Sie nicht geheime Agentennamen von Regierungen verstecken, sind Sie auch mit SHA-1 sicher, aber wenn es kein Problem ist, SHA-2 zu implementieren, verwenden Sie stattdessen diesen.

+2

PKCS # 5 (http://www.rsa.com/rsalabs/node.asp?id=2127) diskutiert einige andere gute Informationen (wie Iterationen), die der Leser beachten möchte. – atk

+2

SHA-1 gilt als gebrochen. –

+0

@Noon Silk: Wie viel Rechenleistung wird derzeit benötigt, um es zu brechen? –

17

Verwenden Sie eine langsame Funktion wie bcrypt. Here ist ein Beitrag von den Phusion-Jungs.

-4

Sie sollten einen Hash-Benutzername, Passwort und Salz zusammen verwenden, wie:

hash(length(username)+"_veryuniquesalt4rtLMAO"+username+password) 

auf diese Weise, Ihre Datenbank zu bestehenden Rainbow-Tabellen nicht verwundbar, weil das Salz, und mit dem Benutzernamen entlang gehasht Mit dem Passwort ist es auch nicht möglich, eine Rainbow-Tabelle für Ihre spezifische Hash-Methode zu erstellen.

Die Verwendung eines "langsamen" Hashalgorithmus sichert die Passwörter besser, als ob sie komplexer wären, aber es ist ein Kompromiss, sobald Sie sich für ein bestimmtes Maß an Langsamkeit entschieden haben, können Sie nicht einfach zurückskalieren brauche die Leistung für andere Dinge.

Es ist auch möglich, die langsame Hashing-Clientseite mit JavaScript zu verwenden, so dass es kein Leistungsproblem sein wird, aber die Methode erfordert natürlich, dass JavaScript aktiviert ist.

Egal, was Sie wählen, ein wenig Slowhashing ist weit besser als nichts, verwenden Sie 1 Millisekunde statt 1 Mikrosekunde und Ihr Schutz ist 1000-mal stärker.

Sie können bcrypt verwenden, oder Sie können einen konventionellen Hashing-Algorithmus eine Menge zusätzlicher Arbeit leisten, stellen Sie nur sicher, dass die zusätzliche Arbeit nicht primär String-Verkettung ist.

Am Ende, besser nicht Ihre Datenbank gestohlen werden, eine Menge von Passwörtern sind so schwach, dass sie leicht extrahiert werden, egal was Sie tun.

+2

Beachten Sie, dass die Eingabe des Benutzernamens in den Hash verhindert, den Benutzernamen zu ändern.In Abhängigkeit von den Systemanforderungen kann dies wünschenswert sein oder auch nicht Wenn es nicht wünschenswert ist, wäre die Verwendung der UID (oder Guid oder Äquivalent) eine Alternative. – atk

+1

Sie müssen nur den Benutzer sein Passwort eingeben, um den Benutzernamen, Best Practice sowieso zu ändern. – aaaaaaaaaaaa

+2

Es gibt einen sehr subtilen Fehler in Ihrem Code - Sie sollten * niemals * Daten in einem Hash concaten. H (x + y + z) öffnet Sie bis zu einem Length Extension Attack. Eher solltest du: H (H (x + y + z)) oder H (H (x) + H (y) + H (z)) –

7

Sie sollten eine passwortbasierte Schlüsselableitungsfunktion als das uid/pwd-Ergebnis verwenden; Die bekannteste ist PBKDF2 http://en.wikipedia.org/wiki/PBKDF2 auch als RFC 2898 http://tools.ietf.org/html/rfc2898 definiert. PKBDF2 nimmt Ihre geheimen Daten sowie eine Salz- und Iterationszählung. Dies ist der Standard Weg zur Lösung Ihres Problems.

Wenn Sie in .NET programmieren, verwenden Rfc2898DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

+1

Ich habe gerade 100 Artikel und Fragen zu diesem Thema gelesen, und es scheint vereinbart, dass RFC2898 oder eine andere Multi-Iteration-Lösung (z. B. BCrypt) der Weg zu gehen ist. Aber Rfc2898DeriveBytes basiert auf SHA-1, nein? Ist es nicht veraltet? Und BCrypt scheint nicht "validiert" zu sein, obwohl es großartig aussieht. Außerdem implementiert Rfc2898DeriveBytes IDisposable nicht, es sieht so aus, als könnte es das Plaintext-Passwort im Speicher ziemlich leicht verlieren. Meine tatsächlichen Bedürfnisse sind nicht so paranoid, aber ich möchte messen, wie sicher jedes Ding ist. Was würden Sie davon halten? Vielen Dank! –