1. 程式人生 > >PHP 非對稱加密函式password_hash() 替代Md5()

PHP 非對稱加密函式password_hash() 替代Md5()

$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