md5自不必说,想必所有phper都用过,但另一个加密函数不知道你见过没有
他就是password_hash();
加密方式更全面.使用起来也比md5+salt这种方式要简洁很多,最主要的是难破解,因为它每时每刻都在变动
它的使用方式大致是这样
1. 用户注册时提交过来密码,我们对用户密码进行加密,这里选择password_hash进行加密
2. 加密之后,将加密好的密码存储到数据表中
3.用户再次登录时,我们从表中取出密码,并使用password_verify函数进行校验,查看两种密码是否相同
简单的使用:
//用户注册时提交的密码
$pass_user_commit = '123456';
//对用户提交的密码进行password_hash加密,并存储到数据库
$pass = password_hash($pass_user_commit,PASSWORD_BCRYPT);
//echo $pass;
//第一次输出生成的密码: $2y$10$Y/rlaKniAaj9y70zJgMfsespKfHNZjM5FyjRRvgbGlKXyr.1yJIIG
//第二次输出生成的密码: $2y$10$vveX2r5nQr4mc2M.8vAdDeTShA0gMX.73uMd18V.Y.7E44qLloqgi
//由此可见,由password_hash函数生成的密码是动态的,破解几乎很难//用户登录时提交的密码
$pass_user = '123456';
//将用户登录时提交的密码与用户注册时提交的密码进行对比
$re = password_verify($pass_user,$pass);
if ($re) {echo "密码真确";
} else {echo "密码错误";
}
如果两次输入的密码不一样,就会输出密码错误
总结:password_hash函数用来加密密码无疑很好用,而且,他还有第三个可选参数,为密码的加密再加一层保障,比如:
//用户注册时提交的密码
$pass_user_commit = '123456';
//对用户提交的密码进行password_hash加密,并存储到数据库
$option = array('cost'=>10);//cost,用来指明算法递归的层数
$pass = password_hash($pass_user_commit,PASSWORD_BCRYPT,$option);
echo $pass;
//第一次输出生成的密码:$2y$10$s78CmhptXOj1oYygCAQPNed.lMFqPBAQpJJXek5nf01pMc46gMLCu
//第二次输出生成的密码:$2y$10$LoXFBGwuLbAs9CvZ/4usT.jLVgKpUnTBCDRODRJXsC3BkTi3Ci.bC
//由此可见,由password_hash函数生成的密码是动态的,破解几乎很难//用户登录时提交的密码
$pass_user = '123456';
//将用户登录时提交的密码与用户注册时提交的密码进行对比
$re = password_verify($pass_user,$pass);
if ($re){echo "密码正确";
}else{echo "密码错误";
}
具体参数详解: php.net
但却存在以下问题
1. 版本要求 php版本必须5.5+ (如果做接口对接,要求双方php版本都在5.5以上,会不会有一些不太现实)
2. 通过password_hash加密的密码基本只能通过php的函数password_verify来校验(这样和其他语言交互时会不会很麻烦呢)
所以呢,如果php自家用,我感觉password_hash真的是一个不错的选择,但如果和其他语言或者外界交互的话,可能就会出现一些小麻烦