PHP >= 5.5 時,能夠使用 password_hash() 和 password_verify() 來對用戶的密碼進行加密和驗證,例如在用戶註冊(加密存儲)和登錄(驗證):php
<?php $password = '12345'; $options = [ 'cost' => 11, // 默認是10,用來指明算法遞歸的層數 // mcrypt_create_iv — 從隨機源建立初始向量 // @param 初始向量大小 // @param 初始向量數據來源 // 可選值有: MCRYPT_RAND (系統隨機數生成器), MCRYPT_DEV_RANDOM (從 /dev/random 文件讀取數據) 和 MCRYPT_DEV_URANDOM (從 /dev/urandom 文件讀取數據)。 在 Windows 平臺,PHP 5.3.0 以前的版本中,僅支持 MCRYPT_RAND。請注意,在 PHP 5.6.0 以前的版本中, 此參數的默認值爲 MCRYPT_DEV_RANDOM。 // 生成一個長度爲22的隨機向量 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), ]; // @param 用戶的密碼 // @param 一個用來在散列密碼時指示算法的密碼算法常量 // PASSWORD_DEFAULT 使用 bcrypt 算法 (PHP 5.5.0 默認),該常量會隨着 PHP 加入更新更高強度的算法而改變。 因此,使用此常量生成結果的長度將在將來有變化。 所以,數據庫裏儲存結果的列可超過60個字符(最好是255個字符) // PASSWORD_BCRYPT 使用 CRYPT_BLOWFISH 算法建立哈希。 這會產生兼容使用 "$2y$" 的 crypt()。 結果將會是 60 個字符的字符串, 或者在失敗時返回 FALSE // @param 一個包含有選項的關聯數組。目前支持兩個選項:salt,在散列密碼時加的鹽(干擾字符串),以及cost,用來指明算法遞歸的層數。省略後,將使用隨機鹽值與默認 cost。 $crypt = password_hash($password, PASSWORD_DEFAULT, $options); // 或 $crypt = password_hash($password, PASSWORD_DEFAULT); var_dump($crypt); // 長度60 var_dump(md5($password)); // 長度32 // 檢查密碼與散列值是否匹配 if(password_verify($password, $crypt)) { echo 'same'; }
說明:password_hash() 詳情見手冊:http://php.net/manual/zh/function.password-hash.php,它是 crypt() (見手冊:http://php.net/manual/zh/function.crypt.php)的一個簡單封裝。 算法
參考:數據庫
<PHP Cookbook>3'rd數組