当前位置: 首页 > ai >正文

PHP password_hash() 函数

password_hash() 函数用于创建密码的散列(hash)

PHP 版本要求: PHP 5 >= 5.5.0, PHP 7

语法

string password_hash ( string $password , int $algo [, array $options ] )

password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。

当前支持的算法:

  • PASSWORD_DEFAULT - 使用 bcrypt 算法 (PHP 5.5.0 默认)。 注意,该常量会随着 PHP 加入更新更高强度的算法而改变。 所以,使用此常量生成结果的长度将在未来有变化。 因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。
  • PASSWORD_BCRYPT - 使用 CRYPT_BLOWFISH 算法创建散列。 这会产生兼容使用 "$2y$" 的 crypt()。 结果将会是 60 个字符的字符串, 或者在失败时返回 FALSE
  • PASSWORD_ARGON2I - 使用 Argon2 散列算法创建散列

PASSWORD_BCRYPT 支持的选项:

  • salt(string) - 手动提供散列密码的盐值(salt)。这将避免自动生成盐值(salt)。

    省略此值后,password_hash() 会为每个密码散列自动生成随机的盐值。这种操作是有意的模式。

    注意:盐值(salt)选项从 PHP 7.0.0 开始被废弃(deprecated)了。 现在最好选择简单的使用默认产生的盐值。

  • cost (integer) - cost 是 PASSWORD_BCRYPT 算法特有的参数,用于指定哈希计算的迭代次数(复杂度)。其值是一个整数,范围为 4 到 31(默认值为 10)。

    • 例如:cost=10 表示迭代 2^10=1024 次;cost=11 则为 2048 次,以此类推。
    • 原理:cost 的值每增加 1,哈希计算的时间大约会翻倍(因为迭代次数是 2^cost)。
    • 安全性:更高的 cost 意味着破解哈希(如暴力破解、彩虹表攻击)需要更长时间,安全性更高。
    • 性能:更高的 cost 会增加服务器计算耗时,可能影响请求响应速度(尤其是高并发场景)

 

PASSWORD_ARGON2I 支持的选项:

  • memory_cost (integer) - 计算 Argon2 散列时的最大内存(单位:字节 byte)。默认值: PASSWORD_ARGON2_DEFAULT_MEMORY_COST

  • time_cost (integer) - 计算 Argon2 散列时最多的时间。默认值: PASSWORD_ARGON2_DEFAULT_TIME_COST

  • threads (integer) - 计算 Argon2 散列时最多的线程数。默认值: PASSWORD_ARGON2_DEFAULT_THREADS

返回值

返回散列后的密码, 或者在失败时返回 FALSE。

实例 1

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

输出结果为:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

实例 2

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

输出结果为:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

实例 4

寻找最佳 cost 的 password_hash() 例子

<?php
/*** 这个例子对服务器做了基准测试(benchmark),检测服务器能承受多高的 cost* 在不明显拖慢服务器的情况下可以设置最高的值* 8-10 是个不错的底线,在服务器够快的情况下,越高越好。* 以下代码目标为  ≤ 50 毫秒(milliseconds),* 适合系统处理交互登录。*/
$timeTarget = 0.05; // 50 毫秒(milliseconds) $cost = 8;
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: 10

http://www.xdnf.cn/news/15332.html

相关文章:

  • Excel常用快捷键与功能整理
  • 当 `conda list` 里出现两个 pip:一步步拆解并卸载冲突包
  • 【时时三省】(C语言基础)用数组名作函数参数
  • MFC中BOOL类型,在某些操作系统中,-1不能被识别,一般是哪些原因?
  • C++-linux 7.文件IO(二)文件描述符、阻塞与非阻塞
  • 招投标——环保大数据平台售后服务计划
  • 现代数据平台能力地图:如何构建未来数据平台的核心能力体系
  • Spark 之 like 表达式
  • uni-app开发的页面跳转全局加载中
  • QT——信号与槽
  • git 访问 github
  • 《恋与深空》中黑白羽毛是谁的代表物?
  • python+Request提取cookie
  • ubuntu22.04下配置qt5.15.17开发环境
  • Elasticsearch9.x核心架构概述
  • 机器学习、深度学习、神经网络之间的关系
  • 多租户云环境下的隔离性保障:虚拟化、容器、安全组如何协同防护?
  • 高德开放平台携手阿里云,面向开发者推出地图服务产品MCP Server
  • Redis技术笔记-主从复制、哨兵与持久化实战指南
  • 工业场合需要千变万化的模拟信号,如何获取?
  • Servlet基础
  • priority_queue的使用和模拟实现以及仿函数
  • FatJar打包和FatJar启动配置文件修改。
  • 对偶原理与蕴含定理
  • [论文阅读] 人工智能 + 软件工程 | 用大语言模型+排名机制,让代码评论自动更新更靠谱
  • Ubuntu22.04 python环境管理
  • 深度解析:htmlspecialchars 与 nl2br 结合使用的前后端协作之道,大学毕业论文——仙盟创梦IDE
  • nginx:SSL_CTX_use_PrivateKey failed
  • 【HTTP版本演变】
  • Python 数据建模与分析项目实战预备 Day5 - 模型训练与评估