Warum fügen Sie beim Erstellen einer Benutzertabelle normalerweise ein Salt-Feld hinzu und führen dann bei der Berechnung des Passworts die MD5-Verschlüsselung basierend auf dem auf der Registrierungsseite eingegebenen Passwort und dem zufällig generierten Salt-Wert durch? Das? Meister Geben Sie eine detaillierte Erklärung.
Warum fügen Sie beim Erstellen einer Benutzertabelle normalerweise ein Salt-Feld hinzu und führen dann bei der Berechnung des Passworts die MD5-Verschlüsselung basierend auf dem auf der Registrierungsseite eingegebenen Passwort und dem zufällig generierten Salt-Wert durch? Das? Meister Geben Sie eine detaillierte Erklärung.
Schwache Passwörter, die mit MD5 verschlüsselt wurden, können immer noch durch Brute Force oder Rainbow Tables geknackt werden. Der Zweck des Hinzufügens von Salt besteht darin, die Schwierigkeit des MD5-Knackens zu erhöhen und dadurch die Sicherheit zu verbessern.
Hauptsächlich, um zu vermeiden, dass nach dem Diebstahl der Datenbank direkt der Klartext des Passworts des Benutzers abgerufen wird.
PHP-Passwort-Hash-Sicherheit
Passwort-Hash-bezogene Funktionen:
password_hash (empfohlen) crypt(blowfish) hash sha1 md5
Die Hash-Funktion unterstützt mehrere Hashing-Algorithmen hash_algos, wie z. B. sha512.
PHP 5.5 hat eine native Passwort-Hashing-API (password_hash/password_verify) bereitgestellt.
Es bietet eine sichere Möglichkeit, das Passwort-Hashing und die Überprüfung abzuschließen.
In PHP 5.3.7 und nachfolgenden Versionen bereitgestellt. Eine Kompatibilitätsbibliothek für Pure PHPs native Passwort-Hashing-API.
Wenn die PHP-Version „password_hash/password_verify“ nicht unterstützt, verwenden Sie stattdessen die Crypt-Implementierung.
Wenn Sie die Funktion „crypt()“ zur Passwortüberprüfung verwenden, müssen Sie eine konstante Zeit wählen String-Vergleichsalgorithmus zur Vermeidung von Timing-Angriffen.
Konstant zeitaufwändig bedeutet, dass die vom String-Vergleich verbrauchte Zeit konstant ist und sich nicht mit der Menge der Eingabedaten ändert Die
-Funktion ist ein ständiger String-Vergleich, ==
, aber ===
kann die Arbeit für Sie erledigen. strcmp()
Daher empfehlen wir Ihnen, nach Möglichkeit native Passwort-Hashes zu verwenden.
password_verify()
Das „Salz“ im Bereich der Verschlüsselung und Entschlüsselung bezieht sich auf einige Daten, die während des Hashing-Prozesses hinzugefügt werden.
Es wird verwendet, um das Risiko eines Vergleichs in der Hash-Wert-Tabelle zu vermeiden die Ausgabedaten, um das Klartext-Passwort zu erhalten.
Es gibt viele Online-Dienste, die berechnete A bereitstellen können Liste der Hash-Werte und ihrer entsprechenden Originaleingaben, und die Datenmenge ist extrem groß.
Durch Hinzufügen von „Salz“ können Sie das Risiko vermeiden, den entsprechenden Klartext direkt aus der Liste zu finden.
Regenbogentabellen werden zur Verschlüsselung verwendet. Eine vorberechnete Tabelle mit inversen Hash-Funktionen, die häufig zum Knacken verschlüsselter Passwort-Hashes verwendet wird.
Die Funktion „password_hash()“ generiert zufällig ein „Salt“.
Bei Verwendung der Funktion „password_hash()“ oder „crypt()“ wird das „Salt“ als Teil des generierten Hash-Werts zurückgegeben.
Kann direkt in der Funktion „password_verify()“ oder „crypt()“ zur Passwortüberprüfung verwendet werden
Eine weitere Verwendung von Salt besteht darin, dass damit Cookies zur Identifizierung von Benutzern erstellt werden können.
Beispielsweise die Implementierung eines benutzerdefinierten Cookie-Sitzungsmechanismus basierend auf der Datenbank:
Dieses Cookie muss nicht nur den Benutzer authentifizieren, sondern auch Außerdem kann es nicht gefälscht oder geknackt werden.
Verwenden Sie bcrypt. PHP 5.5.0 verfügt über den Standardalgorithmus.
<code>//保护用户密码的盐 $salt = sha1( uniqid(getmypid().'_'.mt_rand().'_', true) ); //数据库保存的用户密码($pwd_user是用户输入的密码明文) $pwd_db = sha1($salt.sha1($pwd_user)); //cookie里的盐 //其中$global_salt是配置里定义的全局盐,用来保护用户的盐,一旦修改,所有用户的cookie都将失效. $cookie_salt = sha1($global_salt.sha1($salt)); //最终生成的cookie内容 $cookie = base64_encode($user_id.'|'.$cookie_salt); //如果你需要高安全性,还可以使用MCRYPT_BLOWFISH对整个cookie的内容做一次加密. $cookie = mcrypt_blowfish($cookie, $key); //设置cookie,这里把过期时间设为604800秒(60*60*24*7,一周) setcookie('sessid', $cookie, time()+604800, '/', '', false, true); //解密cookie $cookie = mdecrypt_blowfish($_COOKIE['sessid'], $key); //解码分割后拿到里面的$user_id和$cookie_salt $cookie = explode('|', base64_decode($_COOKIE['sessid'])); list($user_id, $cookie_salt) = $cookie;</code>
http://zhuanlan.zhihu.com/p/2...