建立密碼雜湊

使用 password_hash() 建立密碼雜湊以使用當前行業最佳實踐標準雜湊或金鑰派生。在撰寫本文時,標準是 bcrypt ,這意味著,PASSWORD_DEFAULT 包含與 PASSWORD_BCRYPT 相同的值。

$options = [
    'cost' => 12,
];

$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);

第三個引數不是強制性的

應根據生產伺服器的硬體選擇'cost'值。增加它會使密碼生成成本更高。它產生的成本越高,任何人都試圖破解它以產生它的時間越長。理想情況下,成本應該儘可能高,但實際上應該設定成本,這樣就不會減慢太多的速度。介於 0.1 到 0.4 秒之間就可以了。如果你有疑問,請使用預設值。

Version < 5.5

在低於 5.5.0 的 PHP 上,password_*功能不可用。你應該使用相容包來替換這些功能。請注意,相容包需要 PHP 5.3.7 或更高版本,或者將 $2y 修復程式反向移植到其中的版本(例如 RedHat 提供)。

如果你不能使用它們,你可以用 crypt() 實現密碼雜湊。由於 password_hash() 是作為 crypt() 函式的包裝器實現的,你不需要丟失任何功能。

// this is a simple implementation of a bcrypt hash otherwise compatible
// with `password_hash()`
// not guaranteed to maintain the same cryptographic strength of the full `password_hash()`
// implementation

// if `CRYPT_BLOWFISH` is 1, that means bcrypt (which uses blowfish) is available
// on your system
if (CRYPT_BLOWFISH == 1) {
    $salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
    $salt = base64_encode($salt);
    // crypt uses a modified base64 variant
    $source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    $dest = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt = strtr(rtrim($salt, '='), $source, $dest);
    $salt = substr($salt, 0, 22);
    // `crypt()` determines which hashing algorithm to use by the form of the salt string
    // that is passed in
    $hashedPassword = crypt($plaintextPassword, '$2y$10$'.$salt.'$');
}

Salt 用於密碼雜湊

儘管 crypt 演算法具有可靠性,但仍然存在針對彩虹表的漏洞。這就是為什麼建議使用鹽的原因

salt 是在雜湊之前附加到密碼以使源字串唯一的東西。給定兩個相同的密碼,產生的雜湊值也是唯一的,因為它們的鹽是獨特的。

隨機鹽是密碼安全性中最重要的部分之一。這意味著即使使用已知密碼雜湊的查詢表,攻擊者也無法將使用者的密碼雜湊與資料庫密碼雜湊匹配,因為已使用隨機鹽。你應該始終使用隨機和加密安全的鹽。閱讀更多

使用 password_hash() bcrypt 演算法,純文字 salt 與生成的雜湊一起儲存,這意味著雜湊可以跨不同的系統和平臺傳輸,並且仍然可以與原始密碼進行匹配。

Version < 7

即使不鼓勵這樣做,也可以使用 salt 選項定義自己的隨機鹽。

 $options = [
        'salt' => $salt, //see example below
 ];

重要的。如果省略此選項,則每個密碼雜湊值將由 password_hash() 生成隨機鹽。這是預期的操作模式。

Version >= 7

自 PHP 7.0.0 起,salt 選項已被棄用 。現在優選簡單地使用預設生成的鹽。