php对用户密码进行加密技巧实例

 更新时间:2023年12月18日 14:07:10   作者:enjolras1205  
这篇文章主要为大家介绍了php对用户密码进行加密技巧实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

摘要

密码验证是很常见的需求,如何在实现功能之余,防止用户密码泄露,已经有了很成熟的方案。这篇文章把自己的思考和结论做一下记录。

对用户密码进行加密时需要做到:

防止用户密码明文被窃听

1.交给https,明文传输。

2.客户端将密码加盐(盐随机生成、具有强度)并哈希。服务端再次加盐哈希并对比。假设https被窃听,攻击者破解密码明文也具有相当难度。

防止数据库被攻破时,用户密码明文被窃取。

1.增加哈希算法强度。

2.随机生成具有强度的盐。

一些思考

哈希算法是不可逆的。攻击者可以生成海量的密码 -> 哈希值键值对,反向映射,有概率通过哈希值得到密码。
故,破解的成本=哈希算法强度×盐值数量。

如何选择哈希算法强度

  • 计算耗时用户可接受(视应用场景,如0.2S内)。
  • 计算耗时尽量长,即增加哈希算法强度。

为什么盐要随机

如果盐不随机,攻击者可以针对单个盐生成哈希值->密码键值对,再对整个数据库的哈希值做匹配。
假设盐是保密的,盐可能因为各种原因被攻击者获取(代码泄漏、社会工程学等等)。
攻击者也可以通过在数据库被攻破的网站上注册用户,通过 哈希值->攻击者密码+盐 来破解盐。

为什么盐要有强度

如果盐的强度(长度)不够。攻击者可以建立多个 哈希值->密码 数据库,简单盐被匹配(攻破)的概率更高。

为什么盐可以明文存储

攻击者很难有足够的计算资源和存储空间建立海量的 哈希值->密码 数据库,针对单条用户记录,建立 哈希值->密码 数据库进行攻击的成本过高。

php的实现

最初的想法

需求是房间密码,出于简单考虑,我最初的想法是,MD5+随机盐。
在数据库里大致是这样:

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| uid  | int(11)    | NO  | PRI | NULL    |      |
| pwd  | varchar(45) | YES  |    | NULL    |      |
| salt  | varchar(45) | YES  |    | NULL    |      |
+-------+-------------+------+-----+---------+-------+

php的推荐实现

php的md5文档

http://php.net/manual/zh/func...

给了一个很好的指引:
 

http://php.net/manual/zh/faq....

password_hash 和 crypt 函数返回值的组成部分,依次为:所选择的算法,算法选项,所使用的“盐”,以及散列后的密码。
更改后、数据库表变为:

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| uid  | int(11)    | NO  | PRI | NULL    |      |
| pwd  | varchar(255) | YES  |    | NULL    |      |
+-------+-------------+------+-----+---------+-------+

相较之前的方案:
1.记录了采用的算法(可以在不改动代码的情况下升级算法)
2.记录了采用算法的cost(强度),可以在硬件计算能力上升的情况下,调整cost来维持安全性。
3.盐和哈希值一并返回,简化了接口调用、数据库存储。
php的验证接口设计得相当漂亮。
使用简单,强制调用者使用随机的salt(不容易误用),可在不修改代码的情况下拓展算法强度。
代码:

if (!empty($xxxx_info['pwd'])) {    // 若原来有密码,则要检测
    if (!password_verify($old_pwd, $xxxx_info['pwd'])) {
        // 用户名或密码错
        return;
    }
}
// 对密码长度、内容等不做限制。
// 以应用场景来说,123456之类也无所谓。
$pwd_in_db = password_hash($new_pwd, PASSWORD_DEFAULT, array("cost" => 6));

参考 

https://www.php.net/manual/zh/faq.passwords.php#faq.passwords.fasthash

https://www.jb51.net/article/116492.htm

以上就是php对用户密码进行加密技巧实例的详细内容,更多关于php用户密码加密的资料请关注脚本之家其它相关文章!

相关文章

  • PHP创建PowerPoint2007文档的方法

    PHP创建PowerPoint2007文档的方法

    这篇文章主要介绍了PHP创建PowerPoint2007文档的方法,通过PHP第三方插件PHPPowerPoint类库实现ppt文件的生成功能,非常具有实用价值,需要的朋友可以参考下
    2015-12-12
  • laravel添加前台跳转成功页面示例

    laravel添加前台跳转成功页面示例

    今天小编就为大家分享一篇laravel添加前台跳转成功页面示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法

    ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法

    这篇文章主要介绍了ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法,主要通过针对magic_quotes_gpc开启的情况下进行检查与判断转义来实现,需要的朋友可以参考下
    2014-11-11
  • Yii框架登录流程分析

    Yii框架登录流程分析

    这篇文章主要介绍了Yii框架登录流程,详细的分析了Yii框架的原理与登录的详细流程,有助于深入了解Yii框架的原理,需要的朋友可以参考下
    2014-12-12
  • php之redis短线重连案例讲解

    php之redis短线重连案例讲解

    这篇文章主要介绍了php之redis短线重连案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 解决laravel id非自增 模型取回为0 的问题

    解决laravel id非自增 模型取回为0 的问题

    今天小编就为大家分享一篇解决laravel id非自增 模型取回为0 的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • destoon二次开发常用数据库操作

    destoon二次开发常用数据库操作

    这篇文章主要介绍了destoon二次开发常用数据库操作,需要的朋友可以参考下
    2014-06-06
  • Joomla开启SEF的方法

    Joomla开启SEF的方法

    这篇文章主要介绍了Joomla开启SEF的方法,以Joomla1.5分析了开启SEF的步骤与相关注意事项,需要的朋友可以参考下
    2016-05-05
  • PhpStorm2020.1 安装 debug - Postman 调用的详细教程

    PhpStorm2020.1 安装 debug - Postman 调用的详细教程

    这篇文章主要介绍了PhpStorm2020.1 安装 debug - Postman 调用的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • php5.3以后的版本连接sqlserver2000的方法

    php5.3以后的版本连接sqlserver2000的方法

    这篇文章主要介绍了php5.3以后的版本连接sqlserver2000的方法,包括php5.4、php5.5等版本的通用解决方法,需要的朋友可以参考下
    2014-07-07

最新评论