一、前言
PHP5.5 (PHP 5 >= 5.5.0) 提供了许多新特性及Api函数,其中之一就是Password Hashing API(创建和校验哈希密码)。
它包含4个函数:password_get_info()、password_hash()、password_needs_rehash()、password_verify()。
在PHP5.5之前,我们对于密码的加密可能更多的是采用md5或sha1之类的加密方式(没人像CSDN那样存明文吧。。),如:
echo md5("123456"); //输出: e10adc3949ba59abbe56e057f20f883e
但是简单的md5加密很容易通过字典的方式进行破解,随便找个md5解密的网站就能获取原始密码。
二、Password Hashing API
php5.5提供的Password Hashing API就能很好的解决这些问题。
我们先来看password_hash()函数:
string password_hash ( string $password , integer $algo [, array $options ])
它有三个参数:密码、哈希算法、选项。前两项为必须的。
让我们使用password_hash()简单的创建一个哈希密码:
$pwd = "123456"; $hash = password_hash($pwd, PASSWORD_DEFAULT); echo $hash;
上例输出结果类似:$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2
并且刷新页面该哈希值也会不断的变化。
哈希值创建完毕,我们可以用password_verify()来校验密码是否和哈希值匹配:
boolean password_verify ( string $password , string $hash )
它接收2个参数:密码和哈希值,并返回布尔值。检查之前生成的哈希值是否和密码匹配:
if (password_verify($pwd,'$2y$10$4kAu4FNGuolmRmSSHgKEMe3DbG5pm3diikFkiAKNh.Sf1tPbB4uo2')) { echo "密码正确"; } else { echo "密码错误"; }
基本上使用以上这2个函数就能安全的创建和校验hash密码了,还有另外2个API函数:
password_get_info() //查看哈希值的相关信息 password_needs_rehash() //检查一个hash值是否是使用特定算法及选项创建的
三、点评
虽然通过password_hash()创建的哈希密码更加安全,但是却降低了互操作性。
如我们使用md5方式,在php中用标准的MD5加密,很容易通过其他语言来校验,如node.js:
var hash = crypto.createHash('md5').update("123456").digest('hex'); if(hash == "e10adc3949ba59abbe56e057f20f883e") console.log('密码正确');
而使用password_hash()加密的哈希值基本只能通过PHP的password_verify来校验。
这2种方法各有优劣,是使用md5(或sha1等)+salt(干扰字符串)的方式还是使用password_hash()大家根据具体情况取舍把。
相关推荐
mysql_password_hash MySQL密码和哈希生成器该Python程序创建了一个MySQL 5密码哈希,可用于使用哈希而不是密码来创建MySQL GRANTS。 这在许多情况下很有用,包括使用Puppet的Puppetlabs-MySQL模块,该模块在创建...
$password = md5($_POST["password"]); 上面这段代码是不是很熟悉?然而MD5的加密方式目前在PHP的江湖中貌似不太受欢迎了,因为它的加密算法实在是显得有点简单了,而且很多破解密码的站点都存放了很多经过MD5加密...
密码验证程序密码验证程序将验证password_hash生成的密码,并在必要时刷新密码,并将升级旧密码。 阅读介绍性博客文章:PHP密码散列:失效的简单Implem密码验证器密码验证器验证password_hash生成的... ... 动机为何? ... ...
Hash在线解密平台最新版php实现纯txt存储哈希跟明文对应表查询
gen_lex_hash for pc,mysql交叉编译需要用到的文件,5.1.51 and 5.1.63两个版本,5.1.67版本始终编译不出来。有需要的下载。
在获取到mysql用户的hash后, 可用hash直接登陆mysql进行操作 ...Enter password: ***************************************** 其中1.txt在同目录,内容为你想执行的sql语句, 比如:show databases;
Nginx:一致性哈希(第三方模块ngx_http_consistent_hash):ngx_http_consistent_hash-master.zip
基于应变和应力的Vumat子程序_hashin失效准则_动态应变_拉伸失效_hashin_vumat.zip
一键修复 Chrome浏览器崩溃 STATUS_INVALID_IMAGE_HASH Win10中Edge浏览器此页存在问题 STATUS_INVALID_IMAGE_HASH
NGINX第三方模块:nginx_upstream_hash-0.3.1.tar.gz。
用于复合材料损伤分析,三维损伤umat子程序
Nginx如何配置url_hash转发方式.docx
url_hash 是nginx的第三方模块,nginx本身不支持,需要打patch . Url_hash 你nginx在做负载均衡的时候。把转发的URL 以hash的形式保存。这样可以保证同一个URL始终 分给同一个real server,来提高访问速度。
JPBC简单的使用实例,让你了解JPBC的简单用法
Hash基础知识_Hash基础知识_Hash基础知识_Hash基础知识_Hash基础知识_Hash基础知识_
NGINX第三方模块:nginx_upstream_hash-0.3.2版本。。。
HASH算法MD5的代码实验,编译可以直接使用的MD5源代码