JWT的原理及其相对优缺点

一,Token

token特点
Token 临时且唯一 保证不能够重复 (缓存有效期机制),智能门锁、临时密码 具有有效期2小时
token生成
Token如何生成:uuid作为token。
比如:生成token(uuid生成),作为Rediskey放入redis中,Redis的key作为有效期。

实际项目中,token和sessionid非常相似

session缺陷
传统项目使用session存在缺陷:放入到服务端,
session 类似redis存放缓存内容,
session中的sessionid类似于token,
session共享效率低
大的项目都是基于token替代session,Redis中。

token的使用
每次请求的时候在请求头中传递该token,服务器端接收到
Token,从Redis查找对应key对应的value userid。
再根据userid查询用户信息返回给客户端。
使用token的情况下依赖:必须依赖服务器端redis。
Token:
1)临时且唯一。
2)能够隐藏参数的真实性。

二,JWT

jwt和token的设计思想基本一致。
JWT:json web token
Json:数据交换格式 轻量级、跨语言、减少带宽、可读性高

加密算法

  • 单向加密(不可逆加密,不能反解):MD5、SHA
    在这里插入图片描述
    在这里插入图片描述
    优点:性能好,加密或解密只需要遍历一次

  • 双向加密(可逆加密,需要的时候可以反解为明文) :对称加密(对称加密过程和解密过程使用的同一个密钥) aes des 非对称加密(使用公钥进行加密,使用私钥进行解密。) rsa
    在这里插入图片描述

    根据一个数学原理会生成一对密钥,一个叫公钥、一个叫私钥,同一份文档用公钥加密了就只能用私钥解密。
    缺点:有点复杂,所以机密解密性能不好
    主要两个应用场景:
    1)加密传输:公钥加密,拥有私钥的可以解密。
    2)身份验证:使用私钥进行加密,因为公钥是公开的,理论上所有人都知道,他们通过此来对这个人进行身份验证

JWT主要分成 三个部分组成
第一部分:header头部 ,标记使用什么算法 HS256,RSA256.
第二部分:PayLoad(载荷),jwt存放的数据,注意不能够存放敏感数据(userid、号码)
第三部分:sign,PayLoad采用MD5加密之后的签名值

Jwt生成:
Base64.ENcode(header).Base64.ENcode(PayLoad).签名值

手写JWT

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.0</version>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.72</version>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
</dependency>
package com.shuang;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;

import java.util.Base64;


public class test1 {
    private static String SIGN_KEY="shuang";

    public static void main(String[] args) {
        //head
        JSONObject header =new JSONObject();
        header.put("alg","HS256");
        //payload
        JSONObject payload=new JSONObject();
        payload.put("phone","12345678901");
        //sign
        String sign= DigestUtils.md5Hex(payload+SIGN_KEY);
        String jwt= Base64.getEncoder().encodeToString(header.toJSONString().getBytes())
                +"."+Base64.getEncoder().encodeToString(payload.toJSONString().getBytes())
                +"."+sign;
        System.out.println(jwt);

        //解密
        String[] split=jwt.split("\\.");
        String payLoad=new String(Base64.getDecoder().decode(split[1].getBytes()));

        System.out.println(DigestUtils.md5Hex(payLoad+SIGN_KEY).equals(sign));
        System.out.println(payLoad);
    }
}

在这里插入图片描述

Base64不属于对称加密属于编码器。

Jwt与token的区别
1)token对应的内容存放在Redis中
2)Jwt对应的playload数据存放在客户端

Jwt优点
1),减轻服务端压力。
2),查询效率比token高。
3),不容易被客户端篡改数据。
缺点
1)如果一旦生成好一个jwt之后,后期是否可以销毁
2)Jwt playload数据多,占据服务器端带宽资源
jwt不是很安全,playload中不能存放敏感的信息,必要须加密
jwt注销
无法做真正意义上的注销
1)用户注销时,直接将cookie缓存清除。
2)最好将jwt过期时间定义不要太长。
3)每个用户对应的盐值不一样,用户注销的时候直接将该盐值发生变化。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
JWT(JSON Web Token)和 CSRF token(Cross-Site Request Forgery token)都是常见的安全机制,但它们的作用有所不同。 - JWT 主要用于认证和授权,它是一种基于 JSON 的开放标准,用于在客户端和服务器之间传递安全声明。JWT 通常包含用户身份信息、访问权限等信息,用于验证用户身份和控制用户权限,从而保证数据的安全性和完整性。 - CSRF token 主要用于防止跨站点请求伪造攻击,它是一种随机生成的 token,用于验证用户提交的请求是否合法。CSRF token 通常存储在用户的会话中,当用户提交表单或发出请求时,服务器会将 token 作为隐藏表单字段或请求头信息返回给客户端,客户端再将其作为表单提交或请求头信息一起发送到服务器端进行验证。 它们的优缺点如下: - JWT 的优点是可以在多个应用程序之间共享,由于 JWT 包含了用户身份信息和访问权限等信息,因此可以减少对服务器的重复查询和验证,提高应用程序的性能。但是,如果 JWT 被劫持或篡改,那么攻击者就可以冒充用户进行访问,造成安全风险。 - CSRF token 的优点是可以有效防止跨站点请求伪造攻击,保证用户提交的请求都是合法的,从而保护用户的安全。但是,CSRF token 需要将 token 存储在用户的会话中,如果会话被劫持或泄露,那么攻击者就可以使用该 token 进行攻击,造成安全风险。 综上所述,JWT 和 CSRF token 都是常见的安全机制,应用场景不同,具有各自的优缺点。在实际开发中,应根据具体场景选择合适的安全机制,以保证应用程序的安全性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值