使用password_hash()对密码明文加密

<?php
$password = 'admin'; // 密码明文

// ---------- 说明 ----------
// 相同的密码每次进行password_hash()运算得到的密码哈希都是不同的,正是因为这个特性
// 所以没有办法利用彩虹表破解,而可以利用彩虹表破解恰恰是md5()和sha1()致命弱点。
$passwordHash = password_hash($password, PASSWORD_DEFAULT); // 将密码明文加密

echo "密码明文:{$password}" . PHP_EOL;     // 密码明文:admin
echo "密码哈希:{$passwordHash}" . PHP_EOL; // 密码哈希:$2y$10$YK62GWeWaB5PtPbOhzNzHOWtv6QzrKkfGZkB9pxG3PkJKGVZhN3jG

if (password_verify('12345', $passwordHash)) {
    echo '12345密码正确' . PHP_EOL;
} else {
    echo '12345密码错误' . PHP_EOL; // 12345密码错误
}

if (password_verify('admin', $passwordHash)) {
    echo 'admin密码正确' . PHP_EOL; // admin密码正确
} else {
    echo 'admin密码错误' . PHP_EOL;
}

// ---------- 使用注意事项 ----------
// 1、密码哈希长度目前为60个字符,以“$2y$10$”开头,后面跟一串随机字符串,但是随着PHP加入更新更高强度的算法,密码哈
//    希长度可能超过60个字符,设计数据库时字段长度最好是255个字符。
// 2、password_hash()非常耗时,实验数据显示进行100次循环password_hash()耗时是md5()的5万倍,所以使用password_hash()加
//    密的登录功能会让用户感觉有点慢,但带来的优点是在相同时间内密码重试次数少,可以降低穷举破解密码的风险。
// 3、password_hash()加密和password_verify()验证密码是PHP语言特有的,其它语言没有办法对密码进行操作,即无法跨平台不
//    具备通用性。

Copyright © 2023 码农人生. All Rights Reserved