IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> springsecurity -> 正文阅读

[网络协议]springsecurity

JWT令牌基本介绍和入门

JWT介绍

  • JWT令牌由三部分组成,每部分中间使用点(.)分割,比如aa.bb.cc;
  • Header头部包括令牌的类型(即JWT)及使用的哈希算法(如HMACSHA256或RSA)举例如下:
{
  "alg": "HS256",
  "typ": "JWT"
}
//将上边的内容使用Base64Url编码,得到一个字符串就是JWT令牌的第一部分。
  • Payload部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。最后将第二部分负载使Base64Url编码,得到一个字符串就是JWT令牌的第二部分,举例如下:
{
  "sub": "1234567890",
  "name": "456",
  "admin": true
}
  • Signature部分是签名,此部分用于防止jwt内容被篡改。这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中声明签名算法进行签名,举例如下:
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
  //base64UrlEncode(header) :jwt令牌的第一部;base64UrlEncode(payload):jwt令牌的第二部分;secret:签名所使用的密钥。

JWT生成

1.生成密钥证书

采用RSA 算法每个证书包含公钥和私钥

keytool -genkeypair -alias jeromekey -keyalg RSA -keypass jerome -keystore jm.keystore -storepass jeromekeystore
//Keytool 是一个java提供的证书管理工具
//-alias:密钥的别名
//-keyalg:使用的hash算法
//-keypass:密钥的访问密码
//-keystore:密钥库文件名,xc.keystore保存了生成的证书
//-storepass:密钥库的访问密码
//查询证书信息:keytool -list -keystore xc.keystore
//删除别名:keytool -delete -alias xckey -keystore xc.keystore

1.创建文件夹jwt_gen(本人创建在F盘)
2.在该文件夹下打开cmd命令
执行脚本,如下:

keytool -genkeypair -alias jeromekey -keyalg RSA -keypass jerome -keystore jm.keystore -storepass jeromekeystore

出现如下:
在这里插入图片描述
执行后在jwt_gen夹下生成jm.keystore文件。
查看证书信息:

keytool -list -keystore jm.keystore

在这里插入图片描述
其他操作不做演示。
3.导出公钥(需要安装openssl,一个加解密工具包。安装后在path下设置环境变量。本人安装在D盘,目录为D:\OpenSSL-Win64,因此环境变量设置为D:\OpenSSL-Win64\bin,如下图,点击“计算机”右键选择“高级系统设置”->"环境变量“->"用户变量”;如果不行,在系统变量也加上)
在这里插入图片描述
执行命令:

keytool -list -rfc --keystore jm.keystore | openssl x509 -inform pem -pubkey

在这里插入图片描述
至此,生成公钥就已经完成;下面我们就来测试一下(迫不及待。。。)

2.生成jwt令牌

测试内容可以本地写demo实现,本人是通过搭建一个项目来测试,方便后续拓展。
测试代码如下:

@Test
    public void testCreateJwt(){
        //密钥库文件
        String keystore = "jm.keystore";
        //密钥库的密码
        String keystore_password = "jeromekeystore";

        //密钥库文件路径
        ClassPathResource classPathResource = new ClassPathResource(keystore);
        //密钥别名
        String alias  = "jeromekey";
        //密钥的访问密码
        String key_password = "jerome";
        //密钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(classPathResource,keystore_password.toCharArray());
        //密钥对(公钥和私钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, key_password.toCharArray());
        //获取私钥
        RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate();
        //jwt令牌的内容
        Map<String,String> body = new HashMap<>();
        body.put("name","jerome");
        String bodyString = JSON.toJSONString(body);
        //生成jwt令牌
        Jwt jwt = JwtHelper.encode(bodyString, new RsaSigner(aPrivate));
        //生成jwt令牌编码
        String encoded = jwt.getEncoded();
        System.out.println(encoded);
        //LOGGER.info("result jwt:{}", encoded);
        //encoded为:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiamVyb21lIn0.e2gucjbBaeRTAQnS9DOqBXQbhEZxNS0LjyNRDEFJ_M-eTNzsHU5lRaW8lqyaujPOX39LhwM1dmdX_17TYNFnd1pGAYQi4SGY16ZkHABgvbwyHgPiCSNyoiKD4TcUJNdh3N8e7JWVeIHlNbcpX0YDOzgqi0XXU76jG_-QVh3UpaWNQzQDgIvr6xn0HTGlyVHIrb-zOa__HynKKJTLV195Vx2LqVQy2ZK7zl94LbLUh0bd1T7zjt10Sg-8EJS4QfBE7IqNdYI95B44tDuz5Tz1QC93MZT0Vz-IcWNeJ8LPfWCtQsMyV4CgaUZl12VtPYBwA_OLC_X0fRFOqFEPQuYA8g
    }

生成的jwt令牌为:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiamVyb21lIn0.e2gucjbBaeRTAQnS9DOqBXQbhEZxNS0LjyNRDEFJ_M-eTNzsHU5lRaW8lqyaujPOX39LhwM1dmdX_17TYNFnd1pGAYQi4SGY16ZkHABgvbwyHgPiCSNyoiKD4TcUJNdh3N8e7JWVeIHlNbcpX0YDOzgqi0XXU76jG_-QVh3UpaWNQzQDgIvr6xn0HTGlyVHIrb-zOa__HynKKJTLV195Vx2LqVQy2ZK7zl94LbLUh0bd1T7zjt10Sg-8EJS4QfBE7IqNdYI95B44tDuz5Tz1QC93MZT0Vz-IcWNeJ8LPfWCtQsMyV4CgaUZl12VtPYBwA_OLC_X0fRFOqFEPQuYA8g

3.校验jwt令牌

我们在“生成jwt令牌”中自定义令牌内容为“body.put(“name”,“jerome”)”;校验方法如下:

//校验jwt令牌
    @Test
    public void testCheck(){
        //公钥
        String publickey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj2u/2CjbEnKwwTguNlPFEZFNVA+ec4apjG5ThlZmb3WNIJL9GxTJ2SvBCiTNfVlSD+KginPaLO0z7DqDLjgrTgnL5vVVipNj1Mzx4RCpsSeWtF74Ww2UPjJfvEcgOoKwFEKhqhgGd2YAthcKAzdXhD9jVck4fLOL5jXRgAcIkGCsXSNK2/kDiIH0Oecnoqxz/85YJUEQmWc05sNBp0SsJIhrHNMhrG5nO2BxpM8inMVd5Ja5pNW1om7T9cqRwO19KInVRgxpJgDN7S+DaxpedoP+AhjydG6B5QYV922BkJRUFG0N3A7XWneCIm73D3uxTitgOKd3sg4qebRanrcKYQIDAQAB-----END PUBLIC KEY-----";        //jwt令牌
        //校验jwt令牌
        String jwtString = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiamVyb21lIn0.e2gucjbBaeRTAQnS9DOqBXQbhEZxNS0LjyNRDEFJ_M-eTNzsHU5lRaW8lqyaujPOX39LhwM1dmdX_17TYNFnd1pGAYQi4SGY16ZkHABgvbwyHgPiCSNyoiKD4TcUJNdh3N8e7JWVeIHlNbcpX0YDOzgqi0XXU76jG_-QVh3UpaWNQzQDgIvr6xn0HTGlyVHIrb-zOa__HynKKJTLV195Vx2LqVQy2ZK7zl94LbLUh0bd1T7zjt10Sg-8EJS4QfBE7IqNdYI95B44tDuz5Tz1QC93MZT0Vz-IcWNeJ8LPfWCtQsMyV4CgaUZl12VtPYBwA_OLC_X0fRFOqFEPQuYA8g";
        Jwt jwt = JwtHelper.decodeAndVerify(jwtString, new RsaVerifier(publickey));
        //拿到jwt令牌中自定义的内容
        String claims = jwt.getClaims();
        System.out.println(claims);
        //LOGGER.info("result claims:{}", claims);
        //claims为:{"name":"jerome"}
    }

输出的结果claims为:{“name”:“jerome”};比对一致,与预期一致(有没有一点小小的满足感。。。)。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 12:07:43  更:2021-10-15 12:08:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/29 19:01:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码