在我们的密码加密中常常利用md5或者sha1等,但是这些方法已经不是最优的办理方案,想到的方法是加盐,在php中加盐的方法有很多种,个中内置的方法password_hash比较经典,最近研究,觉得比md5、sha1等方法要好的多,特记之。
封装的代码
<?phpclass 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\"大众; }