一、前言
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()大家根据具体情况取舍把。

原文:http://www.jb51.net/article/48180.htm

PHP的password_hash()使用实例相关推荐

  1. 前端开发基础知识汇总

    一.HTML 1.前言与常用标签 浏览器 内核 备注 IE Trident IE.猎豹安全.360极速浏览器.百度浏览器 firefox Gecko 可惜这几年已经没落了,打开速度慢.升级频繁.猪一样 ...

  2. Spring Cloud微服务系统架构的一些简单介绍和使用

    Spring Cloud 目录 特征 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序上下文层次结构 改变Bootstrap的位置Properties ...

  3. DM达梦数据库 - 设置忽略关键字方法,login关键字处理实例演示

    实例 sql 语句如下: INSERT INTO INTELLIV_USER (ID, LOGIN, PASSWORD_HASH, FIRST_NAME, LAST_NAME, EMAIL, IMAG ...

  4. 10 个 PHP 常见安全问题(实例讲解)

    2020相对于其他几种语言来说, PHP 在 web 建站方面有更大的优势,即使是新手,也能很容易搭建一个网站出来.但这种优势也容易带来一些负面影响,因为很多的 PHP 教程没有涉及到安全方面的知识. ...

  5. Yii2搭建后台并实现rbac权限控制完整实例教程

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 photoshop教程 ...

  6. 【php】 PHP数据库实例

    文章目录 实例简介及准备 操作1:数据准备 操作2:建立major表 操作3:建立user表 登录界面 登录认证 操作1:判断是否认证成功 操作2:跳转到主页面 操作3:密码输入错误跳转到登录页面 操 ...

  7. flask中将实例对象转化为json对象

    ** 由于Flask中没有Django的JsonResponse()方法,所以我们如果要将User.query.all()这样查出来的结果集转化为json对象的时候,就需要自己去实现一个转化为json ...

  8. ECS(Linux)连接RDS,使用命令行方式连接实例

    使用命令行方式连接实例 通过命令行连接RDS MySQL数据库,连接方式如下: mysql -h<连接地址> -P<端口> -u<用户名> -p -D<数据库 ...

  9. Alibaba Cloud Linux 2.1903 LTS 64位服务器yum源下载404,Alibaba Cloud Linux 2实例中使用docker-ce、epel等YUM源安装软件失败

    [Alibaba Cloud Linux 2.1903 LTS 64位]服务器yum源下载404 failure: repodata/repomd.xml from docker-ce-stable: ...

最新文章

  1. unity3D小小白之雾效
  2. Javascript迄今为止添加了前导零
  3. 完成这个例子,说出java中针对异常的处理机制。
  4. 浅谈安卓线程池相关问题
  5. 解决错误: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
  6. zookeeper 密码_「附源码」Dubbo+Zookeeper 的 RPC 远程调用框架
  7. 团队行为心理学读书笔记(3)领导力背后的行为心理学
  8. 100个最古老互联网域名 最久只有23年(附名单)
  9. 营收放缓、股价暴跌、高管离职,Facebook迎来至暗时刻?
  10. java sound 数据处理_Java Sound API:捕获目标端口的声音输出
  11. Android利用温度传感器实现带动画效果的电子温度计
  12. 如何使keystone更有效率
  13. ubuntu下安装jre 7
  14. python 执行dos命令_对python中执行DOS命令的3种方法总结
  15. ESP8266驱动RDA5807实现的FM收音机,可连接WiFi显示B站粉丝数
  16. python控制风扇_Python 语音控制普通风扇实现教程
  17. bilibili封面提取
  18. js 浏览器窗口活跃监听
  19. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
  20. NBOOT分析-S3C244xInit.s(1)

热门文章

  1. 台阶问题(洛谷-P1192)
  2. 输出浮点数(信息学奥赛一本通-T1027)
  3. 在nlog(n)时间里对单链表排序
  4. 计算机应用能力power,全国专业技术人员计算机应用能力考试专用教材——PowerPoint 2003中文演示文稿5日通题库版(双色)(附光盘) - 中国考研网...
  5. 如何用计算机处理频谱,如何使用PicoScope PC示波器对CD播放器的音频频谱进行分析...
  6. python中怎么安装sklearn_如何安装Sklearn for Reinteract?
  7. python将mat文件转为png
  8. delphi测试服务器响应时间,负载测试中的页面响应时间 - Visual Studio (Windows) | Microsoft Docs...
  9. linux版vmware卡顿,Manjaro下Vmware安装的MacOS10.15遇到的性能问题导致几乎无法启动问题及解决...
  10. python oled_用官方的SSD1306.py 驱动 OLED