0

0

ThinkPHP的密码加密怎么实现?ThinkPHP如何使用哈希加密?

畫卷琴夢

畫卷琴夢

发布时间:2025-07-17 16:50:02

|

489人浏览过

|

来源于php中文网

原创

thinkphp中处理密码加密的核心方法是使用php内置的password_hash()和password_verify()函数。1. password_hash()用于注册或修改密码时对明文密码进行哈希处理,自动加盐并调整计算成本,有效防止彩虹表攻击和暴力破解;2. password_verify()用于登录验证时比对用户输入的明文密码与数据库中存储的哈希值,自动处理盐值和迭代次数;3. 推荐在模型层通过set方法或事件监听实现密码自动哈希,确保所有写入操作都经过加密处理,避免遗漏;4. 不推荐使用md5或sha1加密密码,因为它们无盐、计算速度快、易受彩虹表攻击且存在碰撞风险,无法满足现代密码安全需求。采用password_hash()和password_verify()是当前业界公认的密码安全最佳实践。

ThinkPHP的密码加密怎么实现?ThinkPHP如何使用哈希加密?

ThinkPHP中处理密码加密,核心在于利用PHP原生的password_hash()函数进行哈希处理,并配合password_verify()函数进行验证。这是目前业界公认且最为推荐的安全实践,它能有效抵御彩虹表攻击和暴力破解,同时还能自动处理加盐(salt)和迭代(cost)的问题。

ThinkPHP的密码加密怎么实现?ThinkPHP如何使用哈希加密?

当我们谈及用户密码安全,我个人的经验告诉我,直接存储明文密码简直是自寻死路,即使是简单的MD5或SHA1也远不足以应对现代的攻击手段。所以,在ThinkPHP项目中,无论是用户注册还是修改密码,我们都应该将用户输入的密码进行哈希处理后再存入数据库。

具体操作上,ThinkPHP本身并没有提供一个独立的“加密”类库,它聪明地选择了集成PHP内置的password_hash()password_verify()。这俩函数是PHP 5.5+版本引入的,专门为密码处理而生。

立即学习PHP免费学习笔记(深入)”;

ThinkPHP的密码加密怎么实现?ThinkPHP如何使用哈希加密?

比如,在用户注册或修改密码的控制器方法里,你可以这样处理:

bee餐饮点餐外卖小程序
bee餐饮点餐外卖小程序

bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置

下载
<?php
namespace app\index\controller;

use think\facade\Db;

class User
{
    public function register()
    {
        $password = input('post.password'); // 获取用户输入的明文密码

        // 使用 password_hash() 进行哈希处理
        // PASSWORD_DEFAULT 是推荐的选项,它会使用当前PHP版本推荐的哈希算法(目前是bcrypt)
        // 并且会随着PHP版本升级自动更新,提供更好的安全性。
        $hashedPassword = password_hash($password, PASSWORD_DEFAULT);

        // 将哈希后的密码存入数据库
        Db::name('user')->insert([
            'username' => input('post.username'),
            'password' => $hashedPassword,
            'create_time' => time()
        ]);

        return json(['code' => 0, 'msg' => '注册成功']);
    }

    // 登录验证的简单示例
    public function login()
    {
        $username = input('post.username');
        $password = input('post.password');

        $user = Db::name('user')->where('username', $username)->find();

        if (!$user) {
            return json(['code' => 1, 'msg' => '用户不存在']);
        }

        // 使用 password_verify() 验证密码
        // 它会自动处理盐值和迭代次数,你只需要传入明文密码和存储的哈希密码
        if (password_verify($password, $user['password'])) {
            return json(['code' => 0, 'msg' => '登录成功']);
        } else {
            return json(['code' => 1, 'msg' => '密码错误']);
        }
    }
}

我个人更倾向于在模型层进行这种自动化的处理,这样可以确保所有对密码字段的写入操作都能自动进行哈希,避免遗漏。在ThinkPHP的模型中,你可以通过set方法或者事件监听来实现。

ThinkPHP的密码加密怎么实现?ThinkPHP如何使用哈希加密?
<?php
namespace app\index\model;

use think\Model;

class User extends Model
{
    // 定义一个set方法,在设置password字段时自动进行哈希
    public function setPasswordAttr($value)
    {
        return password_hash($value, PASSWORD_DEFAULT);
    }

    // 或者在模型事件中处理,例如 before_insert 或 before_update
    // protected static function init()
    // {
    //     self::event('before_insert', function ($user) {
    //         if (isset($user->password)) {
    //             $user->password = password_hash($user->password, PASSWORD_DEFAULT);
    //         }
    //     });
    //     self::event('before_update', function ($user) {
    //         if (isset($user->password) && $user->isDirty('password')) { // 确保只在密码字段有变化时处理
    //             $user->password = password_hash($user->password, PASSWORD_DEFAULT);
    //         }
    //     });
    // }
}

这样一来,无论你在控制器里是$user->save(['password' => $plainPassword])还是Db::name('user')->insert(['password' => $plainPassword]),只要是模型层操作,密码都会被自动哈希。这种方式,我认为,简直是“一劳永逸”的典范。

为什么不推荐使用MD5或SHA1加密密码?

说起来,这其实是个老生常谈的问题,但每次看到一些项目还在用MD5或SHA1来加密密码,我心里总会咯噔一下。这并非是对这些算法本身的否定——它们在数据完整性校验等领域依然有其价值。但用它们来加密密码,简直是把用户的安全置于险境。

核心原因有几点:

  1. 无盐(No Salt): MD5和SHA1本身不带“盐”的概念。盐(salt)就是一串随机的数据,它会和原始密码混合后再进行哈希。如果两个用户设置了相同的密码,没有盐的情况下,他们的哈希值会一模一样。攻击者一旦破解一个,就能知道所有使用相同密码的用户。加盐后,即使密码相同,哈希值也不同,大大增加了破解难度。password_hash()会自动生成并管理这个盐,并把它内嵌到哈希结果里。
  2. 速度过快: MD5和SHA1的设计初衷是追求计算速度,这在校验文件完整性时是优点。但对于密码哈希来说,速度快反而是个致命弱点。攻击者可以利用高性能计算设备,在短时间内尝试数万亿个密码组合(暴力破解)。如果哈希速度慢,每次尝试的成本就高,破解所需的时间就会呈指数级增长。
  3. 彩虹表攻击: 由于MD5和SHA1哈希速度快且缺乏随机盐,攻击者可以预先计算出大量常用密码的哈希值,制作成“彩虹表”。当他们获取到你的数据库哈希密码时,只需在彩虹表中查找,就能瞬间还原出明文密码。这就像一本字典,你一查就能知道答案。password_hash()由于其随机盐和计算成本,使得彩虹表几乎无效。
  4. 碰撞问题: 虽然MD5和SHA1是单向散列函数,理论上很难逆推,但它们都存在“碰撞”的风险,即不同的输入可能产生相同的哈希值。尽管在密码场景下利用这种碰撞来攻击比较困难,但其潜在的弱点依然存在。

所以我一直强调,密码加密不是简单地“变个样子”,而是要让这个“变样子”的过程变得异常复杂和

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

thinkphp性能怎么样
thinkphp性能怎么样

thinkphp 是一款高性能的 php 框架,具备缓存机制、代码优化、并行处理和数据库优化等优势。官方性能测试显示,它每秒可处理超过 10,000 个请求,实际应用中被广泛用于京东商城、携程网等大型网站和企业系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2024.04.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

494

2023.08.14

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

384

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2111

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号