1. 程式人生 > >PHP的password_hash函式封裝及應用(MD5、sha1的升級版本)

PHP的password_hash函式封裝及應用(MD5、sha1的升級版本)

在我們的密碼加密中常常使用md5或者sha1等,但是這些方法已經不是最優的剞劂方案,想到的方法是加鹽,在php中加鹽的方法有很多種,其中內建的方法password_hash比較經典,最近研究,感覺比md5、sha1等方法要好的多,特記之。

以下是本人封裝的程式碼:

<?php
class hlinfo_Hash {
	private $algo=PASSWORD_DEFAULT;
	private function readCost(){
		$timeTarget = 0.05; // 50 毫秒(milliseconds)
		$cost = 8;
		do {
			$cost++;
			$start = microtime(true);
			password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);
			$end = microtime(true);
		} while (($end - $start) < $timeTarget);
		return $cost;
	}
	private function options(){
		return ['cost' => $this->readCost(),];
	}
	
	public function pwd($pwd){
		return password_hash($pwd, $this->algo, $this->options());
	}
	public function verify($pwd,$hash){
		$msg=array("success"=>false,"newhash"=>false,"msg"=>"");
		if (password_verify($pwd, $hash)) {
			if (password_needs_rehash($hash, $this->algo, $this->options())) {
				$newHash = $this->pwd($pwd);
				$msg=array("success"=>true,"newhash"=>true,"msg"=>$newHash);
			}else{
				$msg=array("success"=>true,"newhash"=>false,"msg"=>"");
			}
		} else {
			$msg=array("success"=>false,"newhash"=>false,"msg"=>"");
		}
		return $msg;
	}
}

使用例子:

<?php  
$cyh=new hlinfo_Hash();  
#獲取密碼的hash值存庫,  
$hash=$cyh->pwd("123456");  
echo "hash str:".$hash.";  
#驗證密碼的正確性,$hash為存庫的hash值,  
$hrs=$cyh->verify("123456", $hash);  
if($hrs['success']){  
#程式判斷是否重新生成hash值,  
 if($hrs['newhash']){  
        #重新生成hash值,更新資料庫的hash值  
        $nhash=$hrs['msg'];  
        echo "認證成功,hash:".$nhash;  
    }else{  
        echo "認證成功,hash未更新!";  
    }  
}else{  
    echo "verify false";  
}