JWT生成的token——中间部分Payload的坑

博客内容讲述了在使用JWT进行token认证时,为了解决敏感信息暴露的问题,采用了AES加密中间Payload部分。这导致在解密时,HttpServletRequest中的token不再符合JWT的三段式结构,从而引发解码错误。作者通过反射的方式,在解密验签成功后,将解密后的JWT格式token重新放入HttpServletRequest中,解决了这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JWT进行token认证应该都用过,标准的加密(Base64 编码)后的token是这样的三段式的:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiaWQiOiIxMjM0NTY3ODkwIiwiZXhwIjoxNjA1MDAxNzQyLCJpYXQiOjE2MDQ5OTQ1NDIsImp0aSI6IjU5YjI2NDEzLTE4MjMtNDVlZS1iZTI1LTA5M2ZjMjlhMmYzOCJ9.FMpVjuTUSOY5sbYqbJslJCnIvExfhPciSHXFZ9B8nH0
他是一个三段式的,中间使用两个.(点)隔开的。

JWT包含了三部分:
Header 头部
Payload 负载
Signature 签名/签证

这里不在详细介绍了,主要说一下JWT组成部分中间的这一段(Payload 负载)自己遇到的坑:

这是上面列举的token中间一段,由于是base64编码可以直接解密出来的,
在这里插入图片描述
在进行渗透测试的时候发现敏感信息暴露,所以需要对信息进行加密。自己的思路就是在生成token后,进行二次加密,如下图:在这里插入图片描述
AES加密后Token: VnkrQUODp5CiSeiX4jMIqE6i6CT29r13fk8k7D39UIMmc3VN6KqM8tfgtkH4si8mHf07Uc2R6Lw2JljJnfoBsmCnEKPwumbxvMaoxdz3cXvLYs4CD2zNHKceguK1ktLCvP4KQrdSrUZRP1HGfJnAdMDYJY748Q7n0LPA+KHtEIn0nYHrZj5x9VRzHHfU2otDwm5yzMV1wjnm2wzKJExYXjyT4zY07vYPtkyCtw6W3KtgeIEYWZyyPfzxvGMGaGJJzPeE563TkpUldF8QAnCXiQ==

这样就没法直接解密出来了。

在解密的时候,先对生成的AES加密信息先解密一次,转成jwt标准的三段式:
在这里插入图片描述
接下来就说到坑了:由于我在token生成时经过AES加密后,HttpServletRequest中此时不是JWT三段式token,这就导致后面接口使用JWT.decode方法获取token信息的时候报错:
在这里插入图片描述
没办法影响到全局功能只能改了,后面查看资料参考这篇资料启发

https://blog.csdn.net/u010698072/article/details/79973830

在token解密验签成功后,我加个反射将解密后的JWT格式token通过反射,修改token值加入到HttpServletRequest中去:

在这里插入图片描述
在这里插入图片描述

这样就就把之前AES解密后的JWT格式的token塞入到httpServletRequest中去了,后面接口获取token信息就正常了。

最后贴上相关的完整代码:

JwUtil:

package token;

import com.shop.result.CommonResult;
import io.jsonwebtoken.*;
import org.apache.tomcat.util.http.MimeHeaders;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class JwtUtil {
   

    public 
<think>嗯,用户想知道如何在Ubuntu中启用和配置root用户登录。我之前记得Ubuntu默认是禁用root用户的,需要通过sudo来执行管理员命令。那具体步骤应该是什么呢? 首先,根据引用里的资料,启用root用户需要使用sudo passwd root命令来设置密码。对的,用户需要先创建一个普通用户,这个用户在安装时会被加入admin组,然后才有权限启用root设置密码后,可以用su root切换,输入新密码就能进入root账户了。不过用户可能还想让root通过SSH登录,这需要修改SSH的配置。 然后,查看引用里的步骤,比如引用[3]和引用[5]提到要编辑/etc/ssh/sshd_config文件,找到PermitRootLogin这一项,改成yes。可能还需要开启密码认证,把PasswordAuthentication设为yes。改完后重启SSH服务,比如用systemctl restart sshd或者service ssh restart。这样root就能远程登录了。 不过用户可能会有疑问,比如为什么要先设置root密码?因为默认情况下root没有密码,所以必须先设置。另外,修改SSH配置的时候要注意权限,可能需要用sudo来编辑文件。还有安全性问题,启用root远程登录可能会有风险,建议用户考虑使用密钥认证或者限制访问IP。 用户可能还会遇到问题,比如修改配置后无法登录,这时候要检查防火墙设置,或者确认SSH服务正确重启。另外,如果PermitRootLogin被注释了,需要取消注释或者新增一行,确保配置生效。 总的来说,步骤应该是:1. 设置root密码;2. 切换root测试;3. 修改SSH配置允许root登录;4. 启用密码认证;5. 重启服务。同时提醒用户注意安全风险,建议仅在必要时启用,并采取其他安全措施。</think>### Ubuntu启用和配置root用户登录的详细步骤 #### 一、启用root用户 1. **设置root密码** 在终端执行命令: ```bash sudo passwd root ``` 输入当前用户密码(安装系统时创建的账户密码),接着设置新的root密码并确认[^2][^3][^5]。 2. **验证root切换** 输入命令切换到root用户: ```bash su root ``` 输入新设置root密码后,命令行提示符将变为`root@hostname:#`,表示已进入root权限环境[^1][^2]。 3. **退出root用户** 在root权限下输入: ```bash exit ``` 可返回普通用户模式[^1]。 --- #### 二、配置SSH允许root登录(可选) > *注意:此操作可能降低系统安全性,建议仅在受信任环境中使用* 1. **修改SSH配置文件** 执行命令编辑配置文件: ```bash sudo nano /etc/ssh/sshd_config ``` 找到以下两处配置项: - 将 `#PermitRootLogin prohibit-password` 改为 `PermitRootLogin yes` - 将 `PasswordAuthentication no` 改为 `PasswordAuthentication yes`[^4] 2. **重启SSH服务** 执行命令使配置生效: ```bash sudo systemctl restart sshd # 或使用旧版命令 sudo service ssh restart ``` --- #### 三、验证远程登录 使用SSH客户端连接: ```bash ssh root@服务器IP ``` 输入root密码后若成功登录,说明配置生效[^3]。 --- ### 安全建议 1. **最小化启用原则** 仅在必要时启用root远程登录,日常操作建议通过`sudo`提权。 2. **密钥认证替代密码** 通过配置SSH密钥登录可大幅提升安全性,操作步骤: ```bash # 生成密钥对 ssh-keygen -t rsa # 上传公钥到服务器 ssh-copy-id root@服务器IP ``` 3. **防火墙限制** 使用UFW限制SSH访问IP: ```bash sudo ufw allow from 指定IP to any port 22 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值