2013-02-07 6 views
6

Ich bin der Entwickler einer neuen Website in PHP gebaut und ich frage mich, was genau ist die beste Sache für Hashing verwenden. Ich habe md5 und sha1 angeschaut, aber gibt es etwas Sichereres.
Es tut mir leid, wenn dies eine nooby Frage ist, aber ich bin neu in PHP Security und ich versuche, meine Website so sicher wie möglich zu machen. Was ist ein Salz?
Danke,
WaseemPHP - MD5, SHA, Hashing Sicherheit

+1

Wofür verwenden Sie den Hash? Wie für Salz siehe http://en.wikipedia.org/wiki/Salt_(cryptography) –

+0

Passwörter und Benutzernamen –

+0

Hinweis: 'bcrypt' - das ist alles. – Leigh

Antwort

9

First off md5 und sha1 zu Kollision Angriffen sein vunrable bewährt haben und Regenbogen leicht eingereicht werden können (wenn sie sehen, wenn Sie das gleiche ist in ihrer Datenbank von gemeinsamen Passwörtern Hash).
Derzeit gibt es zwei Dinge, die sicher genug für Passwörter sind, die Sie verwenden können.
Das erste Wesen sha512. sha512 ist eine Unterversion von SHA2. SHA2 wurde noch nicht als vunabate zu Kollisionsangriffen bewiesen und sha512 erzeugt einen 512-Bit-Hash. Hier ist ein Beispiel für wie sha512 verwenden:

<?php 
hash('sha512',$password); 

Die andere Option ist bcrypt genannt. bcrypt ist berühmt für seine sicheren Hashes. Seine wahrscheinlich die sicherste und am meisten anpassbare auch.
Bevor Sie verwenden beginnen bcrypt Sie, wenn Ihr Sever müssen überprüfen, hat es, Enter aktiviert diesen Code:

<?php 
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { 
    echo "CRYPT_BLOWFISH is enabled!"; 
}else { 
echo "CRYPT_BLOWFISH is not available"; 
} 

Wenn es gibt, dass es der nächste Schritt dann aktiviert wird, ist einfach, alles was Sie brauchen, um tun, um bcrypt einen Passwort (Hinweis für mehr Anpassbarkeit müssen Sie dieses How do you use bcrypt for hashing passwords in PHP? sehen):

crypt($password, $salt); 

nun Ihre zweite Frage zu beantworten. Ein Salt ist normalerweise eine zufällige Zeichenfolge, die Sie am Ende von alle Passwörter hinzufügen, wenn Sie sie hashen. Die Verwendung eines Salzes bedeutet, dass wenn jemand Ihre Datenbank bekommt, sie die Hashes für allgemeine Passwörter nicht überprüfen können. Die Überprüfung der Datenbank erfolgt über eine Rainbow-Tabelle. Sie sollten immer ein Salz beim Hashing verwenden !!

Hier sind meine Beweise für die SHA1 und MD5-Kollision Angriff Schwachstellen:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html, http://eprint.iacr.org/2010/413.pdf, http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf, http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf und Understanding sha-1 collision weakness

+4

Nur für den Rekord: bcrypt ist berühmt für _not_ ist schnell, aber sehr langsam (http://codahale.com/how-to-safely-store-a-password/). – ckruse

+0

Große Antwort !!! – Mez

+0

@ckruse Sorry für den Fehler Ich werde es beheben :) – C1D

1

Der ganze Zweck des Salzes von einem Angreifer zu verlangsamen eine Liste der vor Vergleich -generierte Hashes für den Ziel-Hash.

Anstatt einen Hashwert für jedes Klartextkennwort vorzuberechnen, muss ein Angreifer 16384 Hashwerte für jedes Klartextkennwort vorberechnen (2^7 * 2^7).

Das ein bisschen blass heute aber war ziemlich groß, wenn die Crypt-Funktion wurde zuerst entwickelt - die Rechenleistung zu vorberechnen, dass viele Kennwörter mal die Anzahl der Klartext-Passwort Sie vermuten (Wörterbuch) war ziemlich hoch.

Nicht so sehr heute, weshalb wir Dinge wie Shadow-Passwörter, andere Kern-Passwort-Funktionen neben Krypta und jeder Sysad wollen, dass Sie ein Passwort wählen, das nicht in einem Wörterbuch angezeigt würde.

Wenn die Hashes, die Sie generieren möchten, für Kennwörter sind, ist dies eine gut akzeptierte Methode zur Implementierung.

http://www.openwall.com/phpass/

+0

Danke für die Info! –

+0

Ich habe keine Ahnung, wie Sie die Nummer 16384 bekommen haben und das Salzen ist so wichtig wie immer. Wenn Sie jedes Passwort mit einem anderen Salz kombinieren, muss ein Angreifer eine Rainbow-Tabelle für jedes einzelne Passwort erstellen und nicht eine Rainbow-Tabelle verwenden, um alle Passwörter zu erhalten. Das ist der Zweck des Salzes, es ist kein Geheimnis und es hilft nichts gegen Wörterbuchangriffe. – martinstoeckli

+0

@martinstieckli - Ich glaube, dass Danilo zwei 7-Bit-ASCII-Zeichen als Salz angenommen hat, also 16.384 Möglichkeiten. Und ich denke, ihr Jungs "reden aneinander vorbei", d. H., Ihr beide sagt dasselbe. Anstelle einer Rainbow-Tabelle für "n" Passwörter sind es jetzt 16K Einträge für jedes der "n" Passwörter (oder, konzeptionell, eine 16K x "n" Matrix jetzt anstelle eines "n" Element Arrays). – Dan

0

Wenn Sie planen dies für Passwörter zu tun, dann verwenden MD5 oder SHA1 nicht. Sie sind bekannt dafür, schwach und unsicher zu sein, sogar mit Salz.

Wenn Sie sie für andere Zwecke verwenden (z. B. einen Hash einer Datei bereitstellen, um ihre Authentizität zu bestätigen, oder eine zufällige Hash-Datenbankspalte, um eine pseudozufällige Sortierreihenfolge bereitzustellen), sind sie in Ordnung (bis zu einem gewissen Punkt), aber nicht für Passwörter oder andere Dinge, die Sie als sicher betrachten würden.

Der aktuelle Best-Practice-Algorithmus für das Passwort-Hashing ist BCrypt mit passendem Salzen.

Und der beste Weg, BCrypt Passwort-Hashing in PHP zu implementieren, ist die Verwendung der neuen Passwort-API von PHP. Diese API wird in der nächsten Version von PHP, Version 5.5, die in den nächsten Monaten veröffentlicht werden soll, als eine Reihe von integrierten Funktionen vorgestellt. Die gute Nachricht ist, dass sie auch eine Abwärtskompatibilität für Benutzer der aktuellen Versionen von PHP (5.3 und 5.4) veröffentlicht haben. Obwohl PHP 5.5 noch nicht veröffentlicht wurde, können Sie die neue API sofort verwenden.

Sie können die Kompatibilitätsbibliothek von hier herunterladen: https://github.com/ircmaxell/password_compat

auch: Sie haben gefragt, was „Salz“ ist. Da ich es in dieser Antwort ein paar Mal erwähnt habe, sollte ich auch diesen Teil der Frage ansprechen.

Salt ist im Grunde eine zusätzliche Zeichenkette, die dem Passwort hinzugefügt wird, um es schwieriger zu knacken.

Zum Beispiel kann ein Angreifer im Voraus wissen, was der Hash-Wert für eine gegebene Passwort-Zeichenkette oder sogar für eine ganze Menge gegebener Passwort-Zeichenketten ist. Wenn er Ihre Hash-Daten erhalten kann und Sie kein Salz verwendet haben, kann er Ihre Hashes einfach mit seiner Liste bekannter Passwörter vergleichen, und wenn Ihre Benutzer ein einfach zu erratendes Passwort verwenden, werden sie es sein innerhalb von Sekunden geknackt, unabhängig davon, welche Hash-Methode verwendet wurde.

Wenn Sie dem Kennwort jedoch einen geheimen zusätzlichen String hinzugefügt haben, wenn Sie es hashen, stimmt der Hashwert nicht mit dem Standardhash für das ursprüngliche Kennwort überein, wodurch es für den Angreifer schwieriger wird, den Wert zu finden .

Die gute Nachricht ist, dass wenn Sie die API verwenden, die ich oben erwähnt habe, dann brauchen Sie sich nicht zu viele Gedanken über die Details zu machen, da die API das Salzen für Sie übernimmt.

Hoffe, dass hilft.