2016-04-06 14 views
0

So habe ich PHP-Code, der eine Hash-Version eines Passworts in eine Datei namens passwords.txt speichert. Wie es derzeit aussieht, kann jeder, der das Verzeichnis der Datei kennt (www.example.com/datacache/passwords.txt) darauf zugreifen. Ist das der falsche Weg? Ich dachte, ich wäre dem Leitfaden gefolgt, um die Behandlung des Passworts zu korrigieren, aber das scheint seltsam unsicher zu sein. Gedanken? Vorschläge?Kann ich sha256 gehashte Passwörter im Klartext speichern?

Vielen Dank!

+0

Können Sie uns Ihren Code zeigen? – Genzotto

+0

[Verwenden Sie SHA256 nicht für Passwörter] (https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016). –

Antwort

1

Eigentlich gibt es zwei Fragen hier:

1) Ist es in Ordnung, die Hashes in einer Datei zu speichern

Passwörter Speichern in einer Datei ist nicht bett oder schlimmer als das Speichern in einer Datenbank. Der Punkt bei einer Datei ist, dass sie außerhalb des WWW-Stammverzeichnisses gespeichert werden sollte. Die meisten Provider bieten ein privates Verzeichnis, auf das per Code zugegriffen werden kann, das aber für HTTP-Anfragen nicht erreichbar ist.

2) Ist es sicher

Kein SHA- * und MD5-Passwörter für Hashing Passwörter SHA-256 zu verwenden, nicht direkt verwendet, um Hash werden soll, weil sie zu schnell sind und daher sein kann Brute-Zwang zu leicht. Stattdessen sollte man eine langsame Funktion wie BCrypt, PBKDF2 oder SCrypt verwenden, sie bieten einen Kostenfaktor und fügen automatisch ein sicheres Salz hinzu.

PHP bietet mit zwei Funktionen password_hash() und password_verify(). Benutze sie, sie sind zukunftssicher und produzieren BCrypt-Hashes.

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

Wenn Sie eine alte Version von PHP ausführen, die diese API nicht enthält, aktualisieren Sie. Wenn Sie aus irgendeinem Grund nicht können, überprüfen Sie password_compat.

+0

Gibt es einen Unterschied zwischen der Verwendung eines privaten Verzeichnisses, das von meinem Host angeboten wird (1and1), oder einfach nur eine .htaccess-Datei im Verzeichnis, um Benutzer zu blockieren? – Schwaitz

+0

@kuuy - Sicher meinst du den Befehl 'Verweigern von allen' in der' .htaccess' Datei. In der Praxis ist dies auch eine gute Lösung, theoretisch ist das Out-of-Root-Verzeichnis etwas sicherer. Die htaccess-Methode beruht auf einer korrekten Konfiguration (arbeiten Sie in einem Entwicklerteam?) Und der Annahme, dass die Serversoftware nicht irgendwie ausgetrickst werden kann. Ein weiterer Vorteil des Out-of-Root-Verzeichnisses besteht darin, dass die Passwortdatei nicht Bestandteil der Versionskontrolle ist und Berechtigungen für dieses Verzeichnis restriktiv gesetzt werden können. – martinstoeckli

+1

Also habe ich die Befehle password_has() und password_verify() implementiert (es bedurfte einiger Einschränkungen der 1und1 Einstellungen, um die PHP Version zu wechseln) und die Dinge funktionieren perfekt. Ich meinte ja auch den Deny von allen Befehlen! – Schwaitz

0

Im Idealfall würden Sie sie in einer sicheren SQL-Datenbank oder etwas von dieser Beschreibung speichern; Hashing soll eine zweite Verteidigungslinie sein.

Wenn also Ihre Datenbankdaten verletzt werden und ein Hacker sie erfasst, können sie sich nicht bei jedem Konto anmelden.

Normalerweise ist der Prozess mit jeder Art von Hash, dass, sobald es herausgebracht wird, es die sicherste sein wird, die es jemals sein wird, und dann nach und nach mit der Sammlung von Menschen und erhöhte Computerleistung wird der Hash in der Regel durch eine Sammlung von Rainbow-Tabellen "gebrochen" werden, und wird mit einer Website wie THIS enden, was mit Md5 passiert ist.

Wenn Sie sie in einer TXT-Datei speichern möchten, müssen Sie mindestens sicherstellen, dass Sie das Hash-Kennwort SALT haben. Das Salzen eines Hash-Passworts verringert die Wahrscheinlichkeit, dass es geknackt wird. Bitte lesen Sie die folgenden Links, um zu erfahren, wie Sie Ihren Hash-Wert salzen würden.

Great video by Computerphile on YouTube about the topic

Good tutorial by CrackStation on how to Salt a Hash

Good examples by W3Schools on Hashing/Salting

+0

Schöne Erwähnung von Salz, stellen Sie sicher, dass Sie es richtig mit einem zufällig generierten Salz für jeden Benutzer machen. – Dane

+0

Ja vergessen, das hinzuzufügen. – Tommy

+0

Ich würde nichts von W3schools als "gut" bezeichnen, besonders wenn es um Sicherheit geht. Der Crackstation-Artikel ist großartig, obwohl der Autor (Taylor Hornby) heutzutage wahrscheinlich auf [diese Seite] (https://paragonie.com/blog/2016/02/how-safely-store-password-in--2016) verweisen würde. –