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