2015-05-16 14 views
28

Kürzlich habe ich versucht, meine eigene Sicherheit auf ein Login-Skript zu implementieren, über das ich im Internet gestolpert bin. Nachdem ich versucht hatte zu lernen, wie ich mein eigenes Skript erstellen konnte, um für jeden Benutzer ein "Salz" zu generieren, stolperte ich über password_hash.Wie benutze ich password_hash?

Von was ich verstehe (basierend auf dem Lesen auf dieser Seite: http://php.net/manual/en/faq.passwords.php), Salz wird bereits in der Zeile generiert, wenn Sie password_hash verwenden. Ist das wahr?

Eine andere Frage, die ich hatte, war, wäre es nicht klug, 2 Salze zu haben? Einer direkt in der Datei und einer in der DB? Auf diese Weise, wenn jemand Ihr Salz in der Datenbank kompromittiert, haben Sie immer noch das eine direkt in der Datei? Ich lese hier weiter, dass das Lagern von Salzen niemals eine schlaue Idee ist, aber es hat mich immer verwirrt, was die Leute damit meinen.

+3

Nein. Lassen Sie die Funktion sich um das Salz kümmern. Doppelsalzen wird Ihnen Probleme bereiten und es besteht keine Notwendigkeit dafür. –

Antwort

56

Die Verwendung von password_hash ist die empfohlene Methode zum Speichern von Kennwörtern. Trennen Sie sie nicht von DB und Dateien.

Lassen Sie uns sagen, dass wir die folgende Eingabe haben:

$password = $_POST['password']; 

ich bestätigen nicht die Eingabe nur um das Konzept zu verstehen.

Sie erster Hash das Passwort durch dies zu tun:

var_dump($hashed_password); 

Wie Sie es gehasht sehen:

$hashed_password = password_hash($password, PASSWORD_DEFAULT); 

dann die Ausgabe sehen. (Ich nehme an, du hast diese Schritte gemacht).

Jetzt speichern Sie diese hashed_password in Ihrer Datenbank, und dann lassen Sie uns sagen, wenn ein Benutzer sie eingeloggt sein, fragt Sie überprüfen die Passworteingabe mit diesem Hash-Wert in der Datenbank, indem Sie diese.

// Query the database for username and password 
// ... 

if(password_verify($password, $hashed_password)) { 
    // If the password inputs matched the hashed password in the database 
    // Do something, you know... log them in. 
} 

// Else, Redirect them back to the login page. 
+0

Ok, ich habe es gerade versucht und es hat funktioniert. Ich bezweifelte die Funktion, weil es fast zu einfach schien. Wie lange empfehlen Sie mir, die Länge meines Varchar zu machen? 225? –

+3

Dies ist bereits in den Handbüchern http://php.net/manual/en/function.password-hash.php --- http://php.net/manual/en/function.password-verify.php, dass die OP hat wahrscheinlich nicht gelesen oder verstanden. Diese Frage wurde öfter gestellt als keine. –

+0

Das ist eine andere Seite. –

5

Ja, es ist wahr. Warum bezweifelst du die php faq auf der Funktion? :)

Das Ergebnis password_hash() Lauf hat vier Teile:

  1. der verwendete Algorithmus
  2. Parameter
  3. Salz
  4. tatsächliche Passwort-Hash

So wie Sie sehen können Der Hash ist ein Teil davon.

Sicher, Sie könnten ein zusätzliches Salz für eine zusätzliche Sicherheitsebene haben, aber ich denke wirklich, dass das in einer normalen PHP-Anwendung übertrieben ist. Der voreingestellte bcrypt-Algorithmus ist gut und der optionale Blowfish-Algorithmus ist wohl noch besser.

+0

BCrypt ist eine _hashing_ Funktion, während Blowfish ein Algorithmus für _encryption_ ist. BCrypt stammt jedoch vom Blowfish-Algorithmus. – martinstoeckli

+0

Ja, das ist richtig. –

8

Ja, Sie haben es richtig verstanden, die Funktion password_hash() generiert ein eigenes Salz und fügt es in den resultierenden Hash-Wert ein. Speichern der Salz in der Datenbank ist absolut richtig, es macht seine Arbeit, auch wenn bekannt.

Das zweite Salz, das Sie erwähnten (das in einer Datei gespeicherte), ist eigentlich ein Pfeffer oder ein serverseitiger Schlüssel. Wenn Sie es vor dem Hash-Vorgang hinzufügen (wie das Salz), fügen Sie einen Pfeffer hinzu. Es gibt jedoch einen besseren Weg, Sie könnten zuerst den Hash berechnen und anschließend den Hash mit einem serverseitigen Schlüssel verschlüsseln. Dies gibt Ihnen die Möglichkeit, den Schlüssel bei Bedarf zu ändern.

Im Gegensatz zum Salz sollte dieser Schlüssel geheim gehalten werden. Die Leute mischen es oft und versuchen, das Salz zu verstecken, aber es ist besser, das Salz seine Arbeit machen zu lassen und das Geheimnis mit einem Schlüssel hinzuzufügen.

1

Benutze niemals md5() um dein Passwort zu sichern, sogar mit Salz, es ist immer gefährlich !!

Machen Sie Ihr Passwort mit den neuesten Hash-Algorithmen wie unten beschrieben gesichert.

<?php 

// Your original Password 
$password = '[email protected]'; 

//PASSWORD_BCRYPT or PASSWORD_DEFAULT use any in the 2nd parameter 
/* 
PASSWORD_BCRYPT always results 60 characters long string. 
PASSWORD_DEFAULT capacity is beyond 60 characters 
*/ 
$password_encrypted = password_hash($password, PASSWORD_BCRYPT); 

?> 

Für die Übereinstimmung mit dem verschlüsselten Passwort der Datenbank und dem vom Benutzer eingegebenen Passwort verwenden Sie die folgende Funktion.

<?php 

if (password_verify($password_inputted_by_user, $password_encrypted)) { 
    // Success! 
    echo 'Password Matches'; 
}else { 
    // Invalid credentials 
    echo 'Password Mismatch'; 
} 

?> 

Wenn Sie Ihr eigenes Salz verwenden möchten, nutzen Sie Ihre benutzerdefinierte Funktion erzeugt für die gleiche, nur unten folgen, aber ich nicht empfehlen, da es gefunden in aktuellen Versionen von PHP ist veraltet.

lesen Sie diese http://php.net/manual/en/function.password-hash.php vor der Verwendung unter dem Code.

<?php 

$options = [ 
    'salt' => your_custom_function_for_salt(), 
    //write your own code to generate a suitable & secured salt 
    'cost' => 12 // the default cost is 10 
]; 

$hash = password_hash($your_password, PASSWORD_DEFAULT, $options); 

?> 

Hoffe, das alles hilft !!

+0

Die Option "sort" ist aus guten Gründen veraltet, da die Funktion ihr Bestes gibt, um ein kryptographisch sicheres Salz zu erzeugen, und es ist fast unmöglich, es besser zu machen. – martinstoeckli

+0

@martinstoeckli, ja du hast Recht, ich habe gerade meine Antwort aktualisiert, Danke! –

+0

if (isset ($ _POST ['btn-signup'])) { $ uname = mysql_real_escape_string ($ _ POST ['uname']); $ email = mysql_real_escape_string ($ _ POST ['email']); $ upass = md5 (mysql_real_escape_string ($ _ POST ['pass'])); Dies ist Code in login.php verwendet .. Ich möchte ohne escape und MD5 verwenden. Ich möchte Passwort Hash verwenden .. –

0

Ich habe eine Funktion erstellt, die ich immer benutze, um das Passwort zu überprüfen und Passwörter zu erstellen, z. um sie in einer MySQL-Datenbank zu speichern. Es verwendet ein zufällig erzeugtes Salz, das viel sicherer ist als die Verwendung eines statischen Salzes.

function secure_password($user_pwd, $multi) { 

/* 
    secure_password (string $user_pwd, boolean/string $multi) 

    *** Description: 
     This function verifies a password against a (database-) stored password's hash or 
     returns $hash for a given password if $multi is set to either true or false 

    *** Examples: 
     // To check a password against its hash 
     if(secure_password($user_password, $row['user_password'])) { 
      login_function(); 
     } 
     // To create a password-hash 
     $my_password = 'uber_sEcUrE_pass'; 
     $hash = secure_password($my_password, true); 
     echo $hash; 
*/ 

// Set options for encryption and build unique random hash 
$crypt_options = ['cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)]; 
$hash = password_hash($user_pwd, PASSWORD_BCRYPT, $crypt_options); 

// If $multi is not boolean check password and return validation state true/false 
if($multi!==true && $multi!==false) { 
    if (password_verify($user_pwd, $table_pwd = $multi)) { 
     return true; // valid password 
    } else { 
     return false; // invalid password 
    } 
// If $multi is boolean return $hash 
} else return $hash; 

} 
+2

Es ist am besten, den 'salt' Parameter wegzulassen, er wird automatisch von der Funktion [password_hash()] (http://www.php.net/manual/en/function.password-hash.php) gefolgt Best Practices. Anstelle von 'PASSWORD_BCRYPT' kann man' PASSWORD_DEFAULT' verwenden, um einen zukunftssicheren Code zu schreiben. – martinstoeckli

+0

Danke dafür beraten. Ich muss es in der Dokumentation übersehen haben. Es waren lange Nächte. –

+0

Nach https://secure.php.net/manual/en/function.password-hash.php "Die Option salt ist ab PHP 7.0.0 veraltet. Es wird nun bevorzugt, einfach das generierte Salz zu verwenden standardmäßig." – derelict