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

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


// 重要说明:相同的密码每次进行password_hash()运算得到的字符串都是不同的,正是因为这个特性所以无法利用彩虹表破解,
//           而可以利用彩虹表破解恰恰是md5()和sha1()这类哈希算法的致命弱点。
$hash = password_hash($password, PASSWORD_DEFAULT); // 获取密码哈希字符串


echo "密码明文:$password" . PHP_EOL; // 密码明文:admin
echo "密码哈希:$hash" . PHP_EOL;     // 密码哈希:$2y$10$ua1VtOJ.DDQ42WXd0Ok6ne8pZgIXHJ4V8/1QBT5Subkt127l7ioZ6


// 密码验证(密码错误的情况)
if (password_verify('12345', $hash)) {
    echo '12345密码正确' . PHP_EOL;
} else {
    echo '12345密码错误' . PHP_EOL; // 12345密码错误
}


// 密码验证(密码正确的情况)
if (password_verify('admin', $hash)) {
    echo 'admin密码正确' . PHP_EOL; // admin密码正确
} else {
    echo 'admin密码错误' . PHP_EOL;
}


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

Copyright © 2024 码农人生. All Rights Reserved