<?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