JWT加密解密

本文探讨了加密的两种方式——对称加密和非对称加密,并详细解释了非对称加密中公钥和私钥的概念及优缺点。在实际应用中,这两种加密方式常配合使用,以JWT为例,展示了非对称加密在JWT中的应用,同时提及了RSA和DES加密。文中还提到了相关代码实现。

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

加密方式一般分为两种:对称加密与非对称加密

对称加密:秘钥数量为一个
优点:加密效率高、对方使用相同的秘钥解密
缺点:不安全(相对于非对称加密)

非对称加密:秘钥数量为两个(公钥和私钥)
公钥:任何人都可以持有,一般用于加密作用
私钥:只有自己持有,一般用于数字签名,签名的数据证明是私钥持有人发送来的。私钥签名的数据,私钥持有人无法否认自己发送的消息
优点:安全线高
缺点:公钥加密的数据只有对应的私钥才能解开、加密效率低一般不做大数据加密使用

对称加密与非对称加密使用情况:
一般配合对称加密使用,建立之初先使用非对称加密,协商好对称加密的算法和秘钥,然后进行对称加密,后续解密。

下面代码演示的是JWT的非对称加密方式,上一篇写的是RSA的非对称加密方式,DES对称加密有时间在补充:

依赖一定要导入:

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>
        <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.codec</artifactId>
            <version>1.8</version>
 </dependency>

代码如下:

package rsademo.jwt;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.UnsupportedEncodingException;
import java.util.Base64;

public class JWTDemo1 {

    public static void main(String []args) throws UnsupportedEncodingException {

        //todo heard
        JSONObject header = new JSONObject();
        header.put("Alg","HS256");
        //todo payLoad
        JSONObject payLoad = new JSONObject();
        payLoad.put("name","小李同学");
        payLoad.put("age","25");
        payLoad.put("userId","18888");
        //todo 使用时间戳 每次得到加密后的jwt都不一样 (不使用时间戳或者UUID得到加密后的jwt是一样的)
        //payLoad.put("rd",System.currentTimeMillis());

        //todo 将heard和payLoad进行Base64编码处理
        String jwtHeader = Base64.getEncoder().encodeToString(header.toJSONString().getBytes());
        String jwtPayLoad = Base64.getEncoder().encodeToString(payLoad.toJSONString().getBytes());

        String singKey = "jtwKey";
        //todo 后面在加盐(singKey) 存放在服务器端
        String sing = DigestUtils.md5Hex(payLoad.toJSONString()+singKey);
        String jwt = jwtHeader+"."+jwtPayLoad+"."+sing;
        System.out.println("jwt=="+jwt);

        //todo JWT解密
        //String payLoadStr = jwt.split("\\.")[1];
        String payLoadStr = new String(Base64.getDecoder().decode(jwt.split("\\.")[1].getBytes()),"UTF-8");
        String jwtSing = jwt.split("\\.")[2];
        System.out.println(DigestUtils.md5Hex(payLoadStr+singKey).equals(jwtSing));
    }

    //todo 不使用时间戳jwt加密后的数据都一样
    // jwt==eyJBbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP5p2O5ZCM5a2mIiwidXNlcklkIjoiMTg4ODgiLCJhZ2UiOiIyNSJ9.c413a3dd30924250487eff99e91c3d7e
    // jwt==eyJBbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5bCP5p2O5ZCM5a2mIiwidXNlcklkIjoiMTg4ODgiLCJhZ2UiOiIyNSJ9.c413a3dd30924250487eff99e91c3d7e
    //todo 使用时间戳后jwt加密后的数据都不一样
    // jwt==eyJBbGciOiJIUzI1NiJ9.eyJyZCI6MTYxODUzNTg1MDgyOSwibmFtZSI6IuWwj+adjuWQjOWtpiIsInVzZXJJZCI6IjE4ODg4IiwiYWdlIjoiMjUifQ==.cadd95795b1f1b2905c6d1cd6262051c
    // jwt==eyJBbGciOiJIUzI1NiJ9.eyJyZCI6MTYxODUzNTg2NTgyMCwibmFtZSI6IuWwj+adjuWQjOWtpiIsInVzZXJJZCI6IjE4ODg4IiwiYWdlIjoiMjUifQ==.9fb727fac18dfa29ad158c393dd8cf94

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值