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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值