首页 » PHP教程 » php的md5盐技巧_密码加密我弃用了MD5加盐选择Bcrypt加密

php的md5盐技巧_密码加密我弃用了MD5加盐选择Bcrypt加密

访客 2024-11-05 0

扫一扫用手机浏览

文章目录 [+]

760f055685c0a8fe46e8b249e45a876a

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

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

php的md5盐技巧_密码加密我弃用了MD5加盐选择Bcrypt加密

$password = 'resty123456';$salt = '84b9b7254162b1dcb127289a3de5a873';$password_hash = md5($password . $salt); // 760f055685c0a8fe46e8b249e45a876aBcrypt 特点算法灵巧性:支持多种算法,包括 bcrypt、Argon2i 和 Argon2id。
PHP 5.5.0 引入了 bcrypt,而 PHP 7.2.0 引入了 Argon2。
内置盐:自动为每个密码天生一个随机盐值,确保纵然多个用户利用相同的密码,他们的哈希值也会不同。
本钱因子:可以通过本钱因子(cost factor)来调度哈希打算的繁芜度,从而影响哈希天生的韶光和资源花费。
这有助于抵抗暴力破解攻击。
安全存储:天生的哈希值是唯一的,并且包含了所需的所有信息(如盐和算法类型),因此不须要额外存储盐值。
易于利用:供应了一个大略的接口来天生和验证密码哈希,使得开拓者可以轻松地在运用程序中实现安全的密码存储。
兼容性:天生的哈希值可以在不同版本的PHP之间迁移,只要它们支持相同的算法。
可配置性:可以通过通报选项数组来配置哈希的天生,例如设置本钱因子。
内置验证:password_verify 函数可以验证用户输入的密码与存储的哈希值是否匹配,供应了一种安全的办法来检讨密码。
安全性:由于利用了密钥扩展的哈希函数,这些算法设计用于抵抗各种密码攻击,如彩虹表攻击和暴力破解。
更新性:随着PHP版本的更新,可能会引入更安全的算法,使得密码存储更加安全。

官方文档:https://www.php.net/manual/zh/password.constants.php

php的md5盐技巧_密码加密我弃用了MD5加盐选择Bcrypt加密
(图片来自网络侵删)
利用

利用 password_hash 和 password_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

探求最佳 cost 的 password_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_hash和password_verify是处理PHP运用中用户密码的最安全和推举的办法。
它们供应了内置的盐值和本钱因子,以确保密码存储的安全性。

相关文章

执业药师试卷代码解码药师职业发展之路

执业药师在药品质量管理、用药安全等方面发挥着越来越重要的作用。而执业药师考试,作为进入药师行业的重要门槛,其试卷代码更是成为了药师...

PHP教程 2025-02-18 阅读0 评论0

心灵代码主题曲唤醒灵魂深处的共鸣

音乐,作为一种独特的艺术形式,自古以来就承载着人类情感的表达与传递。心灵代码主题曲,以其独特的旋律和歌词,唤醒了无数人的灵魂深处,...

PHP教程 2025-02-18 阅读0 评论0

探寻福建各市车牌代码背后的文化内涵

福建省,地处我国东南沿海,拥有悠久的历史和丰富的文化底蕴。在这片充满魅力的土地上,诞生了许多具有代表性的城市,每个城市都有自己独特...

PHP教程 2025-02-18 阅读0 评论0

探寻河北唐山历史与现代交融的城市之光

河北省唐山市,一座地处渤海之滨,拥有悠久历史和独特文化的城市。这里既是古丝绸之路的起点,也是中国近代工业的发源地。如今,唐山正以崭...

PHP教程 2025-02-18 阅读0 评论0