您的位置 首页 php

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"; 
}
 

文章来源:智云一二三科技

文章标题:PHP的password_hash函数封装及应用(MD5、SHA1的升级版本)

文章地址:https://www.zhihuclub.com/79506.shtml

关于作者: 智云科技

热门文章

网站地图