0
点赞
收藏
分享

微信扫一扫

jwt默认加密,过期时间,使用rsa加密demo


文章目录

  • ​​1.默认加密调通:​​
  • ​​2.rsa加密方式调通demo:​​

1.默认加密调通:

​​https://github.com/hufanglei/jwt-study/tree/jwt-HMAC256​​

jwt默认加密,过期时间,使用rsa加密demo_base64


springboot+mybatis+jwt+mysql

可以跑通试一下.

jwt默认加密,过期时间,使用rsa加密demo_jwt_02


jwt默认加密,过期时间,使用rsa加密demo_java_03

2.rsa加密方式调通demo:

​​https://github.com/hufanglei/jwt-study​​ 在master分支:

关键在于ras的密钥对如何生成:

public class Keys {

public static final String KEY_ALGORITHM = "RSA";
// public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
public static final String PUBLIC_KEY = "RSAPublicKey";
public static final String PRIVATE_KEY = "RSAPrivateKey";

public static RSAPrivateKey privateKey;
public static RSAPublicKey publicRsaKey;



public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
byte[] publicKey = key.getEncoded();
return encryptBASE64(key.getEncoded());
}

public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
byte[] privateKey = key.getEncoded();
return encryptBASE64(key.getEncoded());

}


public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}


public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}

@PostConstruct
public static Map<String, Object> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
publicRsaKey = (RSAPublicKey) keyPair.getPublic();
privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String, Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicRsaKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}

public static void main(String[] args) {
Map<String, Object> keyMap;
try {
keyMap = initKey();
String publicKey = getPublicKey(keyMap);
System.out.println("打印公钥:====");
System.out.println(publicKey);
String privateKey = getPrivateKey(keyMap);
System.out.println("打印私钥:====");
System.out.println(privateKey);
} catch (Exception e) {
e.printStackTrace();
}

}

}

jwt默认加密,过期时间,使用rsa加密demo_spring_04


测试结果:

jwt默认加密,过期时间,使用rsa加密demo_数据库_05


可以存在内存或者本地文件,或者数据库中。如果在本地文件中,

再提供一个根据文件或者二进制获取公钥,私钥的工具类:

package com.pjb.springbootjwt.utils.token.rsa;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
* 根据字符串或者16进制获取rsa的公钥或者私钥的时候,可能会用到
* Created by ace on 2018/10/23.
*
* @author li
*/
public class RsaUtils {
/**
* 从文件中读取公钥
*
* @param filename 公钥保存路径,相对于classpath
* @return 公钥对象
* @throws Exception
*/
public static PublicKey getPublicKey(String filename) throws Exception {
byte[] bytes = readFile(filename);
return getPublicKey(bytes);
}

/**
* 从文件中读取密钥
*
* @param filename 私钥保存路径,相对于classpath
* @return 私钥对象
* @throws Exception
*/
public static PrivateKey getPrivateKey(String filename) throws Exception {
byte[] bytes = readFile(filename);
return getPrivateKey(bytes);
}

/**
* 获取公钥
*
* @param bytes 公钥的字节形式
* @return
* @throws Exception
*/
public static PublicKey getPublicKey(byte[] bytes) throws Exception {
X509EncodedKeySpec spec = new X509EncodedKeySpec(bytes);
KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePublic(spec);
}

/**
* 获取密钥
*
* @param bytes 私钥的字节形式
* @return
* @throws Exception
*/
public static PrivateKey getPrivateKey(byte[] bytes) throws Exception {
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(bytes);
KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePrivate(spec);
}

/**
* 根据密文,生成rsa公钥和私钥,并写入指定文件
*
* @param publicKeyFilename 公钥文件路径
* @param privateKeyFilename 私钥文件路径
* @param secret 生成密钥的密文
* @throws IOException
* @throws NoSuchAlgorithmException
*/
public static void generateKey(String publicKeyFilename, String privateKeyFilename, String secret) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom secureRandom = new SecureRandom(secret.getBytes());
keyPairGenerator.initialize(1024, secureRandom);
KeyPair keyPair = keyPairGenerator.genKeyPair();
// 获取公钥并写出
byte[] publicKeyBytes = keyPair.getPublic().getEncoded();
writeFile(publicKeyFilename, publicKeyBytes);
// 获取私钥并写出
byte[] privateKeyBytes = keyPair.getPrivate().getEncoded();
writeFile(privateKeyFilename, privateKeyBytes);
}

private static byte[] readFile(String fileName) throws Exception {
return Files.readAllBytes(new File(fileName).toPath());
}

private static void writeFile(String destPath, byte[] bytes) throws IOException {
File dest = new File(destPath);
if (!dest.exists()) {
dest.createNewFile();
}
Files.write(dest.toPath(), bytes);
}
}

这个类贴出来,为了以后自己存数据库的时候,从数据库中获取密钥对,生成jwt的token和验证jwt的token用。


举报

相关推荐

0 条评论