加密方式一般分为两种:对称加密与非对称加密
对称加密:秘钥数量为一个
优点:加密效率高、对方使用相同的秘钥解密
缺点:不安全(相对于非对称加密)
非对称加密:秘钥数量为两个(公钥和私钥)
公钥:任何人都可以持有,一般用于加密作用
私钥:只有自己持有,一般用于数字签名,签名的数据证明是私钥持有人发送来的。私钥签名的数据,私钥持有人无法否认自己发送的消息
优点:安全线高
缺点:公钥加密的数据只有对应的私钥才能解开、加密效率低一般不做大数据加密使用
对称加密与非对称加密使用情况:
一般配合对称加密使用,建立之初先使用非对称加密,协商好对称加密的算法和秘钥,然后进行对称加密,后续解密。
下面代码演示的是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
}