$hashed_password = password_hash('mypassword',PASSWORD_BCRYPT); var_dump(password_verify ('mypassword', $hashed_password.''));
#結果true
我們一般習慣性的使用MD5方法進行用戶密碼的加密處理,但是常見的Md5方法非常容易被一些大型解密網站破解;
PHP提供了 'password_hash()' 函數可以生產更加安全的密碼;
password_hash一共支持三個參數的傳入
password_hash ( string $password , int $algo [, array $options ] )
1:用戶的明文密碼;
2:加密算法 (PASSWORD_DEFAULT PASSWORD_BCRYPT PASSWORD_ARGON2I);
PASSWORD_BCRYPT 支持的選項:
1. salt(string) - 手動提供散列密碼的鹽值(salt)。這將避免自動生成鹽值(salt)。 省略此值后,password_hash() 會為每個密碼散列自動生成隨機的鹽值。這種操作是有意的模式。 鹽值(salt)選項從 PHP 7.0.0 開始被廢棄(deprecated)了。 現在最好選擇簡單的使用默認產生的鹽值。
2. cost (integer) - 代表算法使用的 cost。 省略時,默認值是 10。 這個 cost 是個不錯的底線,但也許可以根據自己硬件的情況,加大這個值
PASSWORD_ARGON2I 支持的選項:
memory_cost (integer) - 計算 Argon2 散列時的最大內存(單位:字節 byte)。默認值: PASSWORD_ARGON2_DEFAULT_MEMORY_COST。 time_cost (integer) - 計算 Argon2 散列時最多的時間。默認值: PASSWORD_ARGON2_DEFAULT_TIME_COST。 threads (integer) - 計算 Argon2 散列時最多的線程數。默認值: PASSWORD_ARGON2_DEFAULT_THREADS。
3.一個包含有選項的關聯數組 目前支持兩個選項:salt (鹽值) cost(用來指明算法遞歸的層數);
返回值: 返回散列后的密碼,失敗的時候返回False; 其中返回的密碼中包含了使用的(算法 cost 鹽值) 所以我們可以不用存儲鹽值和算法的信息;
使用password_verify()可以直接進行驗證;
使用案例:
$options = [ 'cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), ]; password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
輸出:$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.
驗證散列是否和密碼匹配 password_verify()
bool password_verify ( string $password , string $hash )
參數1:傳入用戶密碼 參數2:傳入用戶的哈希值
案例:
$hashed_password = password_hash('mypassword',PASSWORD_BCRYPT); var_dump(password_verify ('mypassword', $hashed_password.''));
PHP官網解釋:http://php.net/manual/zh/faq.passwords.php
http://php.net/manual/zh/function.password-hash.php