JWT教程:生成私钥和公钥、生成jwt令牌、验证jwt令牌

JWT入门

Spring Security 提供对JWT的支持,本节我们使用Spring Security 提供的JwtHelper来创建JWT令牌,校验JWT令牌等操作。

生成私钥和公钥

JWT令牌生成采用非对称加密算法

1、生成密钥证书

下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥

keytool -genkeypair -alias xckey -keyalg RSA -keypass xuecheng -keystore xc.keystore -storepass xuechengkeystore

keytool 是一个java提供的证书管理工具

  • -alias:密钥的别名
  • -keyalg:使用的hash算法
  • -keypass:密钥的访问密码
  • -keystore:密钥库文件名,xc.keystore保存了生成的证书
  • -storepass:密钥库的访问密码

查询证书信息:

keytool -list -keystore xc.keystore

删除别名

keytool -delete -alias xckey -keystore xc.keystore

2、导出公钥

openssl是一个加解密工具包,这里使用openssl来导出公钥信息。
安装 openssl:http://slproweb.com/products/Win32OpenSSL.html
下载下来的名称是:Win64OpenSSL-1_1_0g.exe
配置openssl的path环境变量,本教程配置在D:\OpenSSL-Win64\bin

cmd进入xc.keystore文件所在目录执行如下命令:

keytool ‐list ‐rfc ‐‐keystore xc.keystore | openssl x509 ‐inform pem ‐pubkey

输入密钥库密码:
在这里插入图片描述

下边这一段就是公钥内容:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAijyxMdq4S6L1Af1rtB8SjCZHNgsQG8JTfGy55eYvzG0B
/E4AudR2prSRBvF7NYPL47scRCNPgLnvbQczBHbBug6uOr78qnWsYxHlW6Aa5dI5NsmOD4DLtSw8eX0hFyK5F
j6ScYOSFBz9cd1nNTvx2+oIv0lJDcpQdQhsfgsEr1ntvWterZt/8r7xNN83gHYuZ6TM5MYvjQNBc5qC7Krs9wM7U
oQuL+s0X6RlOib7/mcLn/lFLsLDdYQAZkSDx/6+t+1oHdMarChIPYT1sx9Dwj2j2mvFNDTKKKKAq0cv14Vrhz67Vj
mz2yMJePDqUi0JYS2r0iIo7n8vN7s83v5uOQIDAQAB
-----END PUBLIC KEY-----

将上边的公钥拷贝到文本文件中,合并为一行。

生成jwt令牌

在认证工程创建测试类,测试jwt令牌的生成与验证。

//生成一个jwt令牌
@Test
public void testCreateJwt(){
    
    
	//证书文件
	String key_location = "xc.keystore";
	//密钥库密码
	String keystore_password = "xuechengkeystore";
	//访问证书路径
	ClassPathResource resource = new ClassPathResource(key_location);
	//密钥工厂
	KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,
	keystore_password.toCharArray());
	//密钥的密码此密码和别名要匹配
	String keypassword = "xuecheng";
	//密钥别名
	String alias = "xckey";
	//密钥对(密钥和公钥)
	KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypassword.toCharArray());
	//私钥
	RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate();
	//定义payload信息
	Map<String, Object> tokenMap = new HashMap<>();
	tokenMap.put("id", "123");
	tokenMap.put("name", "mrt");
	tokenMap.put("roles", "r01,r02");
	tokenMap.put("ext", "1");
	//生成jwt令牌
	Jwt jwt = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner(aPrivate));
	//取出jwt令牌
	String token = jwt.getEncoded();
	System.out.println("token="+token);
}

验证jwt令牌

//资源服务使用公钥验证jwt的合法性,并对jwt解码
@Test
public void testVerify(){
    
    
	//jwt令牌
	String token="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHQiOiIxIiwicm9sZXMiOiJyMDEscjAyIiwibmFtZSI6Im1ydCIsI
	mlkIjoiMTIzIn0.KK7_67N5d1Dthd1PgDHMsbi0UlmjGRcm_XJUUwseJ2eZyJJWoPP2IcEZgAU3tUaaKEHUf9wSRwaDgwhrw
	fyIcSHbs8oy3zOQEL8j5AOjzBBs7vnRmB7DbSaQD7eJiQVJOXO1QpdmEFgjhc_IBCVTJCVWgZw60IEW1_Lg5tqaLvCiIl26K
	48pJB5f‐le2zgYMzqR1L2LyTFkq39rG57VOqqSCi3dapsZQd4ctq95SJCXgGdrUDWtD52rp5o6_0uq‐
	mrbRdRxkrQfsa1j8C5IW2‐T4eUmiN3f9wF9JxUK1__XC1OQkOnZTBCdqwWIygDFbU7sf6KzfHJTm5vfjp6NIA";
	//公钥
	String publickey = "‐‐‐‐‐BEGIN PUBLIC KEY‐‐‐‐‐
	MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAijyxMdq4S6L1Af1rtB8SjCZHNgsQG8JTfGy55eYvzG0B/E4AudR2
	prSRBvF7NYPL47scRCNPgLnvbQczBHbBug6uOr78qnWsYxHlW6Aa5dI5NsmOD4DLtSw8eX0hFyK5Fj6ScYOSFBz9cd1nNTvx
	2+oIv0lJDcpQdQhsfgsEr1ntvWterZt/8r7xNN83gHYuZ6TM5MYvjQNBc5qC7Krs9wM7UoQuL+s0X6RlOib7/mcLn/lFLsLD
	dYQAZkSDx/6+t+1oHdMarChIPYT1sx9Dwj2j2mvFNDTKKKKAq0cv14Vrhz67Vjmz2yMJePDqUi0JYS2r0iIo7n8vN7s83v5u
	OQIDAQAB‐‐‐‐‐END PUBLIC KEY‐‐‐‐‐";
	//校验jwt
	Jwt jwt = JwtHelper.decodeAndVerify(token, new RsaVerifier(publickey));
	//获取jwt原始内容
	String claims = jwt.getClaims();
	//jwt令牌
	String encoded = jwt.getEncoded();
	System.out.println(encoded);
}

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/132086175
今日推荐