TP6.0 用户密码明文传输?前端 RSA 加密后端私钥解密保障安全

陌杰大大_5912

陌杰大大_5912

2026-07-07

535人浏览

原创

tp6.0必须通过前端rsa加密+后端私钥解密阻断密码明文传输:前端用jsencrypt对password字段加密并传入公钥,后端用openssl_pkcs1_oaep_padding方式解密,再通过$request->merge()注入明文密码。

tp6.0 用户密码明文传输?前端 rsa 加密后端私钥解密保障安全

TP6.0 用户密码明文传输是典型高危漏洞,安全扫描工具会直接报“敏感字段未加密”,测试同学一测一个准;不加处理就上线,轻则被勒令整改,重则通不过等保测评。必须在提交前用前端RSA加密、后端私钥解密的方式切断明文路径。

生成2048位RSA密钥对并提取公钥

打开在线密钥生成工具(如 https://travistidwell.com/jsencrypt/ 或 http://web.chacuo.net/netrsakeypair),选择2048位长度,点击生成。

生成后,复制完整的 【-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----】 内容,注意首尾换行符也要保留,否则前端JSEncrypt初始化会失败。

把这段公钥字符串粘贴进TP6.0项目的 public/static/js/login.js 文件中,赋值给全局变量:const PUB_KEY = `-----BEGIN PUBLIC KEY-----\n...`;。

前端使用 JSEncrypt 对密码字段加密

在 login.html 页面底部引入 JSEncrypt 库:<script src="/static/js/jsencrypt.min.js"></script>。

方法一:表单提交前拦截加密

给登录按钮绑定 click 事件,在 $.ajax() 发送前,对 password 字段单独加密:

const encrypt = new JSEncrypt(); encrypt.setPublicKey(PUB_KEY); const encryptedPwd = encrypt.encrypt($('#password').val()); data.password = encryptedPwd;

注意:不能对整个 data 对象调用 encrypt.encrypt() —— JSEncrypt 只接受字符串,传入 object 会返回 null,后端收不到密文。

方法二:改用 FormData 提交(兼容文件类字段)

前端设计优化skill
前端设计优化skill

前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。

下载

let formData = new FormData(); formData.append('username', $('#username').val()); formData.append('password', encrypt.encrypt($('#password').val())); $.ajax({ url: '/login', type: 'POST', data: formData, processData: false, contentType: false });

后端 TP6.0 中编写 RSA 解密中间件

第一步:在 app/middleware/ 目录下新建 RsaDecrypt.php

第二步:在中间件中读取 POST 参数 password 字段,判断是否为 Base64 编码格式(含 /+ 字符且长度通常 > 200)

第三步:调用自定义 RSA 工具类解密,将解密结果重新写入 Request 对象的 param 数据池

关键点:TP6.0 的 Request::param() 默认只读原始输入,必须用 $request->merge(['password' => $decrypted]) 才能让后续控制器拿到明文密码。

编写 PHP RSA 解密工具类

在 app/common/utils/ 下创建 RsaDecryptor.php,核心逻辑如下:

public static function decryptByPrivateKey(string $privateKey, string $encryptedData): string { $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($privateKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; $res = openssl_get_privatekey($privateKey); openssl_private_decrypt(base64_decode($encryptedData), $decrypted, $res, OPENSSL_PKCS1_OAEP_PADDING); openssl_free_key($res); return $decrypted; }

【必须使用 OPENSSL_PKCS1_OAEP_PADDING】 —— 若用默认 padding(即 no padding),前端 JSEncrypt 加密时会因数据块长度不匹配直接报错,后端也解不出任何内容。

第四步:在 config/middleware.php 中注册该中间件,作用于 login 接口路由。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

thinkphp 前端

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2583

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6590

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6006

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2583

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5563

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6590

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6238

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

883

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程