全部
常见问题
产品动态
精选推荐

我弃用了MD5加盐的方式加密密码,改用Bcrypt加密密码

管理 管理 编辑 删除

MD5 + Salt

密码存储时使用MD5算法加上盐(salt)是一种常见的安全措施。MD5是一种广泛使用的哈希函数,它可以将任意长度的数据转换为128位的哈希值。但是,MD5本身并不安全,因为它容易受到多种攻击,如碰撞攻击和彩虹表攻击。

760f055685c0a8fe46e8b249e45a876a

使用盐的目的是为了增加哈希的唯一性,使得即使两个用户使用相同的密码,由于盐的不同,最终生成的哈希值也会不同。盐是一个随机生成的数据片段,通常在用户注册或密码设置时生成,并与密码一起哈希。

尽管使用盐可以提高安全性,但MD5由于其已知的弱点,通常不推荐用于需要高安全性的场合。更安全的替代方案包括使用更强大的哈希算法,如SHA-256,以及采用基于密钥的哈希算法,如bcrypt、scrypt或Argon2。这些算法设计用于抵抗暴力破解攻击,并且通常包含内置的盐值和/或密钥扩展机制。

$password = 'resty123456';
$salt = '84b9b7254162b1dcb127289a3de5a873';
$password_hash = md5($password . $salt); // 760f055685c0a8fe46e8b249e45a876a

Bcrypt 特点

  1. 算法灵活性:支持多种算法,包括 bcrypt、Argon2i 和 Argon2id。PHP 5.5.0 引入了 bcrypt,而 PHP 7.2.0 引入了 Argon2。
  2. 内置盐:自动为每个密码生成一个随机盐值,确保即使多个用户使用相同的密码,他们的哈希值也会不同。
  3. 成本因子:可以通过成本因子(cost factor)来调整哈希计算的复杂度,从而影响哈希生成的时间和资源消耗。这有助于抵抗暴力破解攻击。
  4. 安全存储:生成的哈希值是唯一的,并且包含了所需的所有信息(如盐和算法类型),因此不需要额外存储盐值。
  5. 易于使用:提供了一个简单的接口来生成和验证密码哈希,使得开发者可以轻松地在应用程序中实现安全的密码存储。
  6. 兼容性:生成的哈希值可以在不同版本的PHP之间迁移,只要它们支持相同的算法。
  7. 可配置性:可以通过传递选项数组来配置哈希的生成,例如设置成本因子。
  8. 内置验证:password_verify 函数可以验证用户输入的密码与存储的哈希值是否匹配,提供了一种安全的方式来检查密码。
  9. 安全性:由于使用了密钥扩展的哈希函数,这些算法设计用于抵抗各种密码攻击,如彩虹表攻击和暴力破解。
  10. 更新性:随着PHP版本的更新,可能会引入更安全的算法,使得密码存储更加安全。
官方文档:https://www.php.net/manual/zh/password.constants.php

使用

使用 password_hashpassword_verify 是在PHP应用程序中安全处理密码的推荐方式,它们提供了一种简单而有效的方法来保护用户密码。

示例 1

password_hash() 示例

/** 
* 我们想要使用默认算法散列密码 
* 当前是 BCRYPT,并会产生 60 个字符的结果。
* 请注意,随时间推移,默认算法可能会有变化, 
* 所以需要储存的空间能够超过 60 字(255字不错) 
*/
 echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

以上示例的输出类似于

$2y$10$VVgBs.C9CSMbMKEuOjII9OaUWZWXK4VHmS0eIoN1V9JdkWaIOUsXy

示例 2

password_hash() 手动设置 cost 的示例

/** 
* 在这个案例里,我们为 BCRYPT 增加 cost 到 12。 
* 注意,我们已经切换到了,将始终产生 60 个字符。 
*/
$options = [    
'cost' => 12
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);

以上示例的输出类似于

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

示例 #3

寻找最佳 costpassword_hash() 示例

/** 
* 这个示例对服务器做了基准测试(benchmark),检测服务器能承受多高的 cost 
* 在不明显拖慢服务器的情况下可以设置最高的值 
* 10 是个不错的底线,在服务器够快的情况下,越高越好。 
* 以下代码目标为 ≤ 350 毫秒(milliseconds), 
* 对于处理交互式登录的系统来说,这是一个合适的延迟时间。 
*/
$timeTarget = 0.350; // 350 毫秒(milliseconds) 
$cost = 10;
do {
    $cost++;
    $start = microtime(true);
    password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);
    $end = microtime(true);
} while (($end - $start) < $timeTarget);
echo "Appropriate Cost Found: " . $cost;

以上示例的输出类似于

Appropriate Cost Found: 12

示例 #4

使用 Argon2i 的 password_hash() 示例

echo 'Argon2i hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);

以上示例的输出类似于

Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0

验证

password_verify 验证密码是否和散列值匹配。假设我们这里的密码是resty123456

// 默认算法散列密码
$password_hash = password_hash("resty123456", PASSWORD_DEFAULT);
echo '[x] Password Hash ' . $password_hash . PHP_EOL;// 密码验证
if (password_verify('resty123456', $password_hash)) {
    echo '[x] Password is valid!';
} else {
    echo '[x] Invalid password.';
}

以上示例会输出

[x] Password Hash $2y$10$R7x/EzU9uNJ4bXs00G6dLukll9Cm796zu9XgGCO0VltrFAlbOPkTe
[x] Password is valid!

[x] Password Hash $2y$10$6JQg9FTJNN/7sXEcmDe9luRkYst5cpikku9tZwYM67C2THnRAt7C6
[x] Password is valid!

password_verify 函数的第一个参数是用户输入的密码,第二个参数是数据库中存储的哈希密码。这个函数会自动比较输入的密码和哈希密码是否一致,并返回一个布尔值。

小结

快易数据中心在使用 password_hash 函数进行密码哈希处理时,PHP会自动为每个密码生成一个独一无二的盐值,这个盐值会与密码一起存储在哈希密码中,从而增加密码的安全性。

使用password_hashpassword_verify是处理PHP应用中用户密码的最安全和推荐的方式。它们提供了内置的盐值和成本因子,以确保密码存储的安全性。

请登录后查看

快易数据中心 最后编辑于2024-07-26 18:34:58

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}}
沙发 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
816
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
{{item.label}} 加精
{{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服