展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > PHP哈希密码方法与最佳实践

PHP哈希密码方法与最佳实践

最核心且唯一推荐的做法是使用PHP内置的password_hash()函数,结合PASSWORD_BCRYPT或PASSWORD_ARGON2ID算法。该方法自动处理加盐并支持可调成本参数,有效抵御暴力破解和彩虹表攻击。相比已过时且不安全的MD5、SHA1等哈希方式,password_hash()遵循现代密码学最佳实践,确保每个密码哈希值唯一且计算耗时可控。登录时应配合password_verify()验证,并通过password_needs_rehash()实现平滑升级。此外,还需全站启用HTTPS、强

最核心且唯一推荐的做法是使用PHP内置的password_hash()函数,结合PASSWORD_BCRYPT或PASSWORD_ARGON2ID算法。该方法自动处理加盐并支持可调成本参数,有效抵御暴力破解和彩虹表攻击。相比已过时且不安全的MD5、SHA1等哈希方式,password_hash()遵循现代密码学最佳实践,确保每个密码哈希值唯一且计算耗时可控。登录时应配合password_verify()验证,并通过password_needs_rehash()实现平滑升级。此外,还需全站启用HTTPS、强化会话管理、实施输入过滤、防范SQL注入与XSS、记录日志并考虑账户锁定及双因素认证,构建完整认证安全体系。

PHP如何哈希密码_PHP密码哈希的最佳实践与函数选择

使用PHP哈希密码,最核心且唯一推荐的做法是采用内置的password_hash()函数,结合PASSWORD_BCRYPT或更先进的PASSWORD_ARGON2ID算法。这不仅能自动处理加盐(salt)过程,还能通过成本(cost)参数有效抵御暴力破解,是当前保障用户密码安全的黄金标准。忘记MD5、SHA1以及任何自定义的哈希方案,它们在密码安全领域早已过时且危险。

解决方案

坦白说,PHP在密码哈希这件事上,已经给我们提供了一个非常强大且易于使用的工具,那就是password_hash()函数。我个人觉得,任何试图绕过它,或者自己“发明”一套哈希逻辑的做法,都是在给自己挖坑。为什么这么说呢?

首先,password_hash()函数内部集成了最佳实践。它会为每个密码自动生成一个随机且唯一的盐值(salt),并将其与哈希结果一起存储。这意味着即使两个用户设置了相同的密码,它们的哈希值也会完全不同,从而有效防御了彩虹表攻击。此外,它支持可调节的计算成本(cost factor),你可以根据服务器的性能,调整哈希计算所需的时间。计算时间越长,暴力破解的难度就越大,但同时也要注意,不能设置得过高导致服务器负载过重,影响用户体验。

目前,password_hash()支持的主要算法有PASSWORD_BCRYPTPASSWORD_ARGON2ID

  • PASSWORD_BCRYPT:这是最常用、兼容性最好的选项。它基于Blowfish算法,并且经过了时间考验。如果你不确定选择哪个,用它准没错。它的默认成本因子通常是10,但你可以根据实际情况调整。
  • PASSWORD_ARGON2ID:这是更现代、更强大的选择,尤其在对抗GPU和ASIC等硬件加速破解方面表现更优。它不仅消耗CPU时间,还消耗内存,这使得它对并行攻击(如GPU集群)的抵抗力更强。但需要注意的是,它要求PHP 7.2及以上版本,并且需要系统安装相应的Argon2库。如果你的环境支持,并且对安全性有极致要求,我强烈建议优先考虑Argon2ID。

哈希密码的流程大致是这样:

  1. 注册/修改密码时:

    $password = $_POST['password']; // 从用户输入获取明文密码
    $hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
    // 或者使用 Argon2ID (PHP 7.2+):
    // $hashedPassword = password_hash($password, PASSWORD_ARGON2ID, ['memory_cost' => 65536, 'time_cost' => 4, 'threads' => 1]);
    // 将 $hashedPassword 存储到数据库中

    这里我把cost设置为12,这是一个比较平衡的数字,你可以根据服务器性能进行测试和调整。Argon2ID的参数则更复杂一些,需要根据实际需求和测试结果来设定。

  2. 登录时验证密码:

    $password = $_POST['password']; // 用户输入的明文密码
    // 从数据库中取出存储的哈希密码,假设是 $storedHashedPassword
    if (password_verify($password, $storedHashedPassword)) {
        // 密码匹配,用户认证成功
        echo "登录成功!";
        // 检查是否需要重新哈希(比如成本因子变了,或者算法升级了)
        if (password_needs_rehash($storedHashedPassword, PASSWORD_BCRYPT, ['cost' => 12])) {
            $newHashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
            // 更新数据库中的哈希密码为 $newHashedPassword
            // 这步很重要,可以平滑地升级哈希策略
            echo "密码已自动升级哈希算法。";
        }
    } else {
        // 密码不匹配,认证失败
        echo "用户名或密码错误。";
    }

    password_verify()函数会自动处理盐值和算法,你只需要传入用户输入的明文密码和数据库中存储的哈希值即可。password_needs_rehash()则是一个非常实用的函数,它能帮助我们在不强制用户重置密码的情况下,平滑地升级密码哈希的算法或成本参数,这在长期维护的应用中尤其重要。

PHP中,为什么不推荐使用MD5或SHA1来哈希密码?

说实话,每次看到还有人在用MD5或SHA1来哈希密码,我都会感到一丝担忧。这就像在信息安全的高速公路上,你还在开一辆没有安全气囊、没有ABS的老爷车。MD5和SHA1本身是设计用来做“校验和”(checksum)或“数据完整性验证”的单向散列函数,它们的特点是计算速度快,而且输出长度固定。但这些优点,在密码哈希领域,恰恰变成了致命的弱点。

首先,它们的计算速度太快了。这意味着攻击者可以在短时间内尝试数以亿计甚至万亿计的密码组合。现代的GPU集群,配合专门的破解软件,可以在几分钟甚至几秒钟内暴力破解出常见的MD5或SHA1哈希值。相比之下,password_hash()这类专门的密码哈希函数,通过引入计算成本,可以故意让哈希过程变慢,将破解时间从几秒延长到数年甚至更久,这才是我们想要的。

其次,MD5和SHA1极易受到“彩虹表攻击”(Rainbow Table Attack)。彩虹表是预先计算好大量常用密码及其哈希值的数据库。由于MD5和SHA1缺乏内置的“盐”(salt)机制(即使你手动加盐,也很容易因为实现不当而失效),攻击者只需查表就能快速找到对应明文。而password_hash()为每个密码生成的唯一盐值,使得彩虹表攻击几乎无效,因为每个密码的哈希值都是独一无二的。

再者,MD5早已被证明存在严重的“碰撞攻击”(Collision Attack)漏洞,这意味着可以找到两个不同的输入,产生相同的MD5哈希值。虽然SHA1的碰撞攻击难度更高,但其安全性也已被业界普遍认为不足。虽然这些碰撞攻击对直接破解密码的威胁不如暴力破解和彩虹表那么直接,但它们无疑表明了这些算法的脆弱性,不适合用于高安全要求的场景。

在我看来,使用MD5或SHA1来哈希密码,无异于将用户的账户安全置于极大的风险之中。这些算法从未被设计用于抵御现代密码破解技术,它们的“快”和“简单”在今天看来,已经成了最不负责任的妥协。

如何正确选择和配置PHP的password_hash()算法及成本参数?

选择和配置password_hash()的算法及成本参数,是一个需要权衡安全性和性能的决策。这事儿没有一劳永逸的答案,它需要你根据自己的服务器环境、用户规模以及对安全性的预期来做判断。

算法选择:

  • PASSWORD_BCRYPT: 这是一个非常稳健且广泛支持的选择。如果你的PHP版本低于7.2,或者你希望获得最好的兼容性,那么PASSWORD_BCRYPT是你的首选。它在PHP 5.3.7之后就有了,几乎所有现代PHP环境都支持。
  • PASSWORD_ARGON2ID: 如果你的PHP版本是7.2或更高,并且系统安装了libargon2库(通常通过--with-password-argon2编译PHP或安装相应的扩展),那么我强烈建议你优先考虑PASSWORD_ARGON2ID。它被认为是目前最强的密码哈希算法之一,尤其在抵抗GPU和ASIC等硬件加速破解方面表现卓越,因为它不仅消耗CPU时间,还消耗大量内存,这使得并行攻击的成本极高。

成本参数(Cost Factor)的配置:

无论你选择BCRYPT还是ARGON2ID,核心思想都是通过增加计算量来延缓破解速度。

  • 对于PASSWORD_BCRYPT 它使用一个cost参数,通常是一个整数,表示2的指数次方。默认值通常是10。我的建议是,通过基准测试来确定一个合适的cost值。理想情况下,一次密码哈希操作应该在0.2秒到0.5秒之间完成。如果太快,安全性不足;如果太慢,会影响用户登录体验,甚至可能被用于拒绝服务攻击(DoS)。

    你可以这样测试:

    $timeTarget = 0.5; // 目标是0.5秒
    $cost = 8;
    do {
        $cost++;
        $start = microtime(true);
        password_hash("test_password", PASSWORD_BCRYPT, ["cost" => $cost]);
        $end = microtime(true);
    } while (($end - $start) < $timeTarget);
    
    echo "找到最佳的 cost 值是: " . $cost . "\n";
    echo "在该 cost 值下,哈希耗时: " . ($end - $start) . " 秒\n";

    在你的生产服务器上运行这段代码,找到一个合适的cost值,然后将其固定下来。随着服务器性能的提升,你可能需要定期重新评估这个值。

  • 对于PASSWORD_ARGON2ID 它有更精细的参数控制:memory_cost (m), time_cost (t), threads (p)。

    • memory_cost:指定内存消耗,以字节为单位。通常用2的幂次方表示,例如65536(64MB)。
    • time_cost:指定CPU迭代次数。
    • threads:指定并行线程数。 这些参数的调整比BCRYPT更复杂,通常建议从Argon2的推荐值开始,然后根据你的服务器内存和CPU情况进行微调。官方推荐的参数通常能提供很好的安全性。

关键点: 始终记住,即使你选定了算法和成本,也要利用password_needs_rehash()函数。这个函数能让你在未来升级哈希算法(比如从BCRYPT升级到ARGON2ID)或提高成本参数时,无需强制所有用户重置密码。当用户下次登录时,系统会自动检测到哈希值过时,然后用新的算法或成本重新哈希他们的密码,并更新数据库。这是一种非常优雅且用户友好的安全升级策略。

除了哈希密码,还有哪些与用户认证安全相关的PHP最佳实践?

密码哈希只是用户认证安全体系中的一个重要环节,但绝不是全部。构建一个健壮的用户认证系统,需要从多个维度进行考量和实践。在我看来,除了强大的密码哈希,以下几点也同样关键:

1. 全站HTTPS加密传输: 这是最基础也是最不容忽视的一点。所有涉及用户敏感信息的页面,包括登录、注册、修改密码等,都必须通过HTTPS(HTTP Secure)协议进行传输。HTTPS通过SSL/TLS证书对客户端和服务器之间的通信进行加密,有效防止了中间人攻击(Man-in-the-Middle Attack),确保用户输入的明文密码在传输过程中不被窃听。如果你的网站还在使用HTTP,那么即使你的密码哈希做得再好,用户输入的明文密码在到达服务器之前就已经暴露在风险之中了。

2. 健全的会话管理机制: 用户登录后,服务器会创建一个会话(Session)来维持用户的登录状态。会话安全至关重要。

  • 会话ID的再生(Session ID Regeneration): 在用户登录成功后,立即调用session_regenerate_id(true)来生成一个新的会话ID。这可以有效防御会话固定攻击(Session Fixation Attack),防止攻击者预设一个会话ID并诱导用户使用。
  • 设置HttpOnly和Secure标志:php.ini或通过session_set_cookie_params()设置会话Cookie的HttpOnlySecure标志。HttpOnly可以防止JavaScript通过document.cookie访问会话Cookie,从而抵御XSS攻击获取会话ID;Secure则确保会话Cookie只在HTTPS连接下发送。
  • 合理的会话过期时间: 根据业务需求设置合理的会话过期时间,不宜过长,同时提供“记住我”选项时要谨慎处理,并使用更安全的长期令牌(如带有过期时间和IP绑定的刷新令牌)。

3. 严格的输入验证与过滤: “永远不要相信用户的输入”是安全领域的一条金科玉律。所有从用户端接收到的数据,包括用户名、密码、邮箱、评论内容等,都必须进行严格的验证、过滤和清理。

  • 防止SQL注入: 使用预处理语句(Prepared Statements)配合参数绑定(Parameterized Queries),例如PHP的PDO或MySQLi的预处理功能。永远不要直接将用户输入拼接到SQL查询中。
  • 防止XSS攻击: 对所有输出到HTML页面的用户生成内容进行适当的转义或编码,例如使用htmlspecialchars()
  • 防止CSRF攻击: 在所有表单中加入CSRF令牌(Token),并在服务器端验证该令牌,确保请求来自合法的用户会话。

4. 错误处理与日志记录: 不要向用户暴露详细的错误信息,如数据库连接失败的细节、文件路径或代码栈追踪。这些信息可能被攻击者利用来获取系统弱点。将详细的错误信息记录到服务器端的日志文件中,便于开发人员调试和审计。同时,对认证失败、异常登录尝试等事件进行日志记录,可以帮助发现潜在的攻击行为。

5. 账户锁定策略: 为了防止暴力破解登录,可以实现一个账户锁定机制。例如,在一定时间内(如5分钟)连续输错密码超过N次(如5次),则暂时锁定该账户一段时间(如30分钟),或者要求用户进行额外的验证(如验证码、邮箱验证)。这大大增加了暴力破解的成本和难度。

6. 双因素认证(2FA): 对于高安全要求的应用,引入双因素认证(Two-Factor Authentication)是提升账户安全性的有效手段。除了密码,用户还需要提供第二个认证因素,如手机验证码、TOTP(基于时间的一次性密码)应用生成的代码或指纹识别等。这即使在密码被泄露的情况下,也能有效保护用户账户。

综合来看,一个安全的用户认证系统是一个多层次、多维度的防御体系。密码哈希是核心,但离开了其他最佳实践的支撑,它的效果也会大打折扣。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。