DINGE, DIE MAN SICH MERKEN SOLLTE
Es wurde schon viel über Passwortverschlüsselung für PHP gesagt, und das meiste davon ist ein sehr guter Rat, aber bevor Sie überhaupt mit der Verwendung von PHP für die Passwortverschlüsselung beginnen, sollten Sie sicherstellen, dass Sie die folgenden Punkte implementiert haben oder bereit sind, sie zu implementieren.
SERVER
PORTEN
Egal wie gut Ihre Verschlüsselung ist, wenn Sie den Server, auf dem PHP und DB laufen, nicht richtig absichern, sind alle Ihre Bemühungen wertlos. Die meisten Server funktionieren relativ gleich: Ihnen sind Ports zugewiesen, über die Sie entweder per FTP oder Shell auf sie zugreifen können. Vergewissern Sie sich, dass Sie den Standardport der aktiven Fernverbindung ändern. Wenn Sie dies nicht tun, haben Sie dem Angreifer einen Schritt weniger abverlangt, um auf Ihr System zuzugreifen.
BENUTZERNAME
Um alles in der Welt sollten Sie nicht den Benutzernamen admin, Root oder etwas Ähnliches verwenden. Auch wenn Sie ein unixbasiertes System verwenden, sollten Sie das Root-Konto NICHT zugänglich machen, sondern immer nur sudo.
PASSWORT
Wenn Sie Ihren Nutzern sagen, dass sie gute Passwörter verwenden sollen, um nicht gehackt zu werden, dann tun Sie das auch. Welchen Sinn hat es, sich die Mühe zu machen, die Vordertür abzuschließen, wenn die Hintertür weit offen steht?
DATENBANK
SERVER
Idealerweise sollten Sie Ihre DB und Ihre ANWENDUNG auf getrennten Servern betreiben. Dies ist aus Kostengründen nicht immer möglich, bietet aber ein gewisses Maß an Sicherheit, da der Angreifer zwei Schritte durchlaufen muss, um vollständig auf das System zuzugreifen.
BENUTZER
Ihre Anwendung sollte immer über ein eigenes Konto für den Zugriff auf die DB verfügen und nur mit den erforderlichen Berechtigungen ausgestattet sein.
Dann haben Sie ein separates Benutzerkonto für sich, das nirgendwo auf dem Server gespeichert ist, auch nicht in der Anwendung.
Wie immer sollte man diese Wurzel oder etwas Ähnliches NICHT machen.
PASSWORT
Befolgen Sie die gleichen Richtlinien wie bei allen guten Passwörtern. Verwenden Sie dasselbe Passwort auch nicht für andere SERVER- oder DB-Konten auf demselben System.
PHP
PASSWORT
Speichern Sie NIEMALS ein Passwort in Ihrer DB, sondern speichern Sie stattdessen den Hash und den eindeutigen Salt, ich werde später erklären, warum.
HASHING
ONE WAY HASHING!!!!!!!, Hashes sollten einseitig sein, d.h. man kehrt sie nicht um und vergleicht sie mit dem Passwort, sondern hasht das eingegebene Passwort auf dieselbe Weise und vergleicht die beiden Hashes. Das bedeutet, dass ein Angreifer, selbst wenn er Zugriff auf die DB erhält, nicht weiß, wie das eigentliche Passwort lautet, sondern nur den daraus resultierenden Hash. Das bedeutet mehr Sicherheit für Ihre Benutzer im schlimmsten Fall.
Es gibt eine Menge guter Hashing-Funktionen ( password_hash
, hash
etc...), aber Sie müssen einen guten Algorithmus für den Hash auswählen, um effektiv zu sein. (bcrypt und ähnliche Algorithmen sind anständig.)
Wenn es auf die Hash-Geschwindigkeit ankommt, gilt: je langsamer, desto resistenter gegen Brute-Force-Angriffe.
Einer der häufigsten Fehler beim Hashing ist, dass Hashes nicht eindeutig für den Benutzer sind. Das liegt vor allem daran, dass die Salts nicht eindeutig generiert werden.
SALZEN
Passwörter sollten immer erst gesalzen und dann gehasht werden. Beim Salting wird dem Kennwort eine zufällige Zeichenfolge hinzugefügt, damit ähnliche Kennwörter in der DB nicht gleich aussehen. Wenn das Salt jedoch nicht für jeden Benutzer eindeutig ist (d. h. wenn Sie ein fest codiertes Salt verwenden), ist Ihr Salt so gut wie wertlos geworden. Denn sobald ein Angreifer ein Passwort-Salto herausgefunden hat, hat er das Salt für alle anderen Passwörter.
Wenn Sie einen Salt erstellen, stellen Sie sicher, dass er für das zu salzende Passwort eindeutig ist, und speichern Sie dann sowohl den fertigen Hash als auch den Salt in Ihrer DB. Dies führt dazu, dass ein Angreifer jedes Salt und jeden Hash einzeln knacken muss, bevor er sich Zugang verschaffen kann. Das bedeutet für den Angreifer viel mehr Arbeit und Zeit.
BENUTZER, DIE PASSWÖRTER ERSTELLEN
Wenn der Benutzer ein Passwort über das Frontend erstellt, muss es an den Server gesendet werden. Dies stellt ein Sicherheitsproblem dar, da das unverschlüsselte Passwort an den Server gesendet wird und wenn ein Angreifer in der Lage ist, es abzuhören und darauf zuzugreifen, ist die gesamte Sicherheit in PHP wertlos. Übertragen Sie die Daten IMMER SICHER, dies geschieht durch SSL, aber seien Sie vorsichtig, auch SSL ist nicht fehlerfrei (OpenSSLs Heartbleed-Fehler ist ein Beispiel dafür).
Bringen Sie den Benutzer auch dazu, ein sicheres Passwort zu erstellen, das ist einfach und sollte immer gemacht werden, der Benutzer wird am Ende dafür dankbar sein.
Unabhängig von den Sicherheitsmaßnahmen, die Sie ergreifen, ist nichts zu 100 % sicher. Je fortschrittlicher die Technologie zum Schutz ist, desto fortschrittlicher werden die Angriffe. Aber wenn Sie diese Schritte befolgen, wird Ihre Website sicherer und für Angreifer weit weniger begehrenswert.
Hier ist eine PHP-Klasse, die auf einfache Weise einen Hash und ein Salt für ein Passwort erstellt
http://git.io/mSJqpw
14 Stimmen
openwall.com/phpass ist auch eine sehr gute Bibliothek
60 Stimmen
Md5 ist jetzt völlig unsicher
3 Stimmen
@NSAwesomeGuy Das hängt davon ab, wofür Sie es verwenden. Es ist trivial, ungesalzene MD5-Passwörter mit Rainbow-Match oder Brute-Force zu knacken, aber mit anständigem Salting ist es immer noch äußerst unpraktisch, eine Rainbow-Tabelle zum schnellen Knacken von Passwortsätzen zu erstellen, und Brute-Force ist ein No-Hoper.
15 Stimmen
PHP 5.5+ hat einen sicheren Passwort-Hash eingebaut php.net/manual/de/function.passwort-hash.php
0 Stimmen
php.net/faq.passwort
0 Stimmen
Wie man die Passwort-Hashing-Funktionen von PHP 5.5 verwendet
0 Stimmen
Siehe auch Openwalls Portables PHP-Passwort-Hashing-Framework (PHPass). Es ist gegen eine Reihe von häufigen Angriffen auf Benutzerpasswörter gehärtet.
0 Stimmen
Eingebaut seit v5.6 php.net/manual/de/function.passwort-hash.php