安全顶部

我刚宣布了新的学习Spring Security课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程
休息顶部

通过参考,使用Spring 5和Spring Boot 2开始学习春天课程:

>>查看课程

1.概述

一种json web令牌(JWT)通常用于REST API安全性。虽然令牌可以通过框架解析,例如春天安全oauth.,我们可能希望在自己的代码中处理这个令牌。

在本教程中,我们会解码并验证JWT的完整性

2.JWT令牌结构

首先,让我们了解JWT令牌的结构:

  • 标题
  • 有效载荷(通常被称为身体)
  • 签名

签名是可选的。有效的JWT令牌可以仅包含标题和有效载荷部分。然而,我们使用签名部分来验证标题和有效载荷的内容安全授权

部分表示为Base64编码字符串分隔('。')分隔符。通过设计,任何人都可以解码JWT令牌并读取标题和有效载荷部分的内容。但是,我们需要访问用于创建签名以验证令牌的完整性的秘密密钥。

最常见的是,JWT包含用户的“声明”。这些代表有关用户的数据,API可以用于授予金宝搏官网188be提供令牌的用户的权限或跟踪。解码令牌允许应用程序使用数据,验证允许应用程序相信由可信源生成JWT。

让我们看看如何在Java中解码和验证令牌。

3.解码JWT令牌

我们可以使用内置的Java函数来解码令牌。

首先,让我们将令牌分成几个部分:

string [] chunks = token.split(“\\。”);

我们应该注意到正则表达式通过string.split.使用一个逃脱'。'避免'。'意思是“任何角色”。

我们的数组现在应该有2或3个元素对应JWT的部分。

接下来,让我们使用Base64解码器解码标题和有效载荷零件:

base64.decoder解码器= base64.getdecoder();字符串标题=新字符串(解码器。(块[0]));String Payload = New String(解码器.Decode(块[1]));

让我们用jwt令牌运行这个代码(我们可以解码在线比较结果):

Eyjhbgciojiuzi1niisinr5cci6ikpxvcj9​​.eyjzdwiioixmjm0nty3odkwiiwixmftzsi6ikjhzwxkdw5nifvzzxiilcjpyxqioje1mtyymzkwmjj9.qh7zj_m3ky69kxhaqxta-ivipytkxxjzc1zsmapznge.

输出将给我们解码后的报头任何有效载荷:

{“ALG”:“HS256”,“典型”:“JWT”}{“子”:“1234567890”,“名字”:“Bael金宝搏188体育dung用户”,“iat”:1516239022}

如果在JWT令牌中仅定义标题和有效载荷部分,则完成并将信息已成功解码。

4.验证JWT令牌

接下来,我们可以验证标题和有效载荷的完整性,以确保通过使用签名部分未更改它们。

4.1。依赖性

对于验证,我们可以添加JJWT.对我们pom.xml.

<依赖项>  IO.JSONWEBTOKEN   JJWT   0.7.0  

我们应该注意我们需要从版本的图书馆版本0.7.0向前。

4.2。配置签名算法和密钥规范

为了开始验证有效载荷和报头,我们需要最初用于签名令牌的签名算法和秘钥:

SignaturealGorithm SA = HS256;scotekeyspec screttykeyspec = new scotterkeyspec(secretkey.getbytes(),sa.getjcaname());

在这个例子中,我们已经将签名算法硬编码为HS256。但是,我们可以解码标题的JSON并阅读all.字段以获得此值。

我们还应该注意这个变量密钥是密钥的字符串表示形式。我们可以通过它的配置或通过发出JWT的服务公开的REST API来为我们的应用程序提供这些。

4.3。执行验证

现在我们已经有了签名算法和密钥,我们可以开始执行验证了。让我们将头部和有效载荷重新组合成一个未签名的JWT,将它们与'。分隔符:

String tokenwithoutsignature =块[0] +“。”+块[1];字符串签名=块[2];

现在我们拥有未签名的令牌和提供的签名。我们可以使用库验证它:

defaultjwtsignaturevalidator validator = new defaultjwtsignaturevalidator(sa,secretkeyspec);if(!validator.isvalid(tokenwithoutsignature,signature)){抛出新例外(“无法验证JWT令牌完整性!”);}

让我们来分析一下。

首先,我们用所选的算法和secret创建一个验证器。然后我们向它提供未签名的令牌数据和提供的签名。

然后。验证器生成新的签名,并将其与提供的签名进行比较。如果它们相等,那么我们已经验证了标题和有效载荷的完整性。

结论

在本教程中,我们研究了JWT的结构以及如何将其解码为JSON。

然后,我们使用一个库来验证一个令牌的签名、算法和密钥的完整性。

一如既往,可以找到本教程中的代码示例在github上。

安全底

我刚宣布了新的学习Spring Security课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程
休息底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程 :

>>查看课程
对这篇文章的评论关闭!