黑马程序员技术交流社区

标题: 【郑州校区】Java的新项目学成在线笔记-day16(九) [打印本页]

作者: 谷粒姐姐    时间: 2019-6-19 10:27
标题: 【郑州校区】Java的新项目学成在线笔记-day16(九)
3.6.3 JWT入门
Spring Security 提供对JWT的支持,本节我们使用Spring Security 提供的JwtHelper来创建JWT令牌,校验JWT令牌 等操作。 3.6.3.1 生成私钥和公钥
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文件所在目录执行如下命令:
[AppleScript] 纯文本查看 复制代码
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----
将上边的公钥拷贝到文本文件中,合并为一行。
  3.6.3.2 生成jwt令牌
在认证工程创建测试类,测试jwt令牌的生成与验证。

[AppleScript] 纯文本查看 复制代码
//生成一个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);   }  







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2