PHP实现基于PBKDF2标准的password_hash和password_verify函数是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
最近国家对网络安全要求很严格,我们产品的合作伙伴要求我们使用PBKDF2标准来存储密码。由于对这个标准不熟悉,于是我做了点功课。
一个基本的常识,用户的密码不能明文存储,不然,一旦黑客获取到了数据库信息,密码就直接泄露了。
升级一点,密码直接使用sha1或者更高安全的sha2算法,生成散列值,存入数据库,大部分的密码存储就是这样设计的。这样是否就足够安全了呢?
不是,因为黑客依然可以使用彩虹表和暴力破解的方式破解密码。
要解决这两个问题,就要做到以下两点:
1. 密码生成过程中加入随机salt,做到同一个密码每次hash值都不同,使彩虹表失效。
2. 加密算法的运行速度相对比较慢,这样会使黑客的暴力破解成本增加。
目前主流的密码存储算法有bcrypt和PBKDF2等,PHP从5.5开始加入了password_hash和password_verify函数,内置支持了bcrypt算法,如果想加强密码存储的安全性,对算法没有特别要求,可以直接使用。
然而对于需要使用PBKDF2标准处理加密存储,就没有现成的函数可以使用了,不过PHP在5.5开始加入了hash_pbkdf2函数,于是使用这个函数我实现了基于PBKDF2标准的password_hash以及password_verify函数。代码如下:
function password_hash_pbkdf2($password){
$iterations=1000;
$length=30;
$salt = openssl_random_pseudo_bytes(8);
$salt_encode=base64_encode($salt);
$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, $length);
return $hash.$salt_encode;
}
function password_verify_pbkdf2($password,$hash){
$iterations=1000;
$length=30;
$passhash=substr($hash,0,$length);
$salt=base64_decode(substr($hash,$length));
$passhash3=hash_pbkdf2("sha256", $password, $salt, $iterations, $length);
if($passhash==$passhash3){
return true;
}
return false;
}
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/jamesren/blog/4650728