如何验证JWT令牌

发表在
7分钟阅读 2020年4月14日

- - -

JWT代表JSON Web标记。这是一个安全验证机制现在广泛使用的一天。JWT基本上是一串随机字母数字字符。JWT隔开点的有三个部分,头,有效载荷和签名。JWT看起来是这样的

我需要验证什么?

你看到为什么它被称为JSON web标记。它由JSON对象,base64url-encoded并隔开点连接在一起作为一个字符串。任何人都拥有JWT解码,可以看到内容。JWT标记数字签名(签名部分)使用负载的内容和一个密钥。为了改变内容,所需的密钥生成签名,否则,签名将无效。当一个令牌发布到服务器时,它必须验证检查是否有人的令牌。缺乏适当的验证可以导致严重的安全问题,在这里我们将看到如何正确验证JWT。

为了验证JWT,你必须知道JWT的内容。

标题的内容描述了JWT密码操作数据。这意味着标题包含的信息类型的令牌和算法用于生成签名(是的有不止一个,我们将讨论最常用的)。所以在标题的例子中,我们有一个JSON对象包含一个类型属性的typ和算法性能alg其价值是算法用于生成签名。他们称这是JWT令牌类型属性,这是我们非常首先检查来验证,如果值是JWT或者其他东西。这个属性是可选的但是因为我们正在讨论所有可能的选项是安全的,我们可以检查这个属性,它的值应该JWT。另一个属性”哭的”(内容类型)是用来传达JWT的结构信息。

{
:“typ JWT”,
:“alg HS256”
}

有效载荷

智威汤逊的有效载荷是核心部分包含可核查的安全声明,如用户的身份和权限允许的。也称为负载信息索赔。JWT声称的名字有三个类:

1。注册要求的名字

2。公开声明的名字

3所示。私人要求的名字

注册索赔是预定义的索赔。公开声明可以是任何用户定义信息和私人声称的生产国和消费国的JWT同意使用一些特殊的或私人的说法。

为了验证JWT,我们应该检查一些注册要求。一些重要的注册声明定义如下。

“国际空间站”(发行人)索赔

“国际空间站”(发行人)标识发布了JWT的主要要求。这个索赔的处理通常是特定于应用程序的。“国际空间站”值是区分大小写的包含一个URI字符串值。这种说法的使用是可选的。我们应该确认发行人是一个有效的URL或JWT发送出预期的发行人。

“子”(主题)

“子”(主题)声称标识主要就是JWT的主题。智威汤逊的索赔通常陈述。“子”值是区分大小写的字符串包含一个URI的值。这种说法的使用是可选的。

“澳大利亚”(观众)

“澳大利亚”(观众)声称JWT用于标识收件人。每个主要旨在处理JWT必须证明自己价值的观众说。如果校长处理索赔不确定本身的一个值“澳大利亚”声称当这种说法出现了,那么JWT必须拒绝。在一般情况下,“澳大利亚”值是区分大小写的字符串数组,每个都包含一个URI的值。这种说法的使用是可选的。

“实验”(过期时间)

“实验”(过期时间)声称识别JWT的过期时间或之后不能接受处理。“实验”的处理索赔要求当前日期/时间必须在过期日期/时间列在“实验”的说法。它的值必须是一个包含一个时间戳值。这种说法的使用是可选的。

“nbf”(不是之前)

“nbf”(不是之前)声称识别JWT的时间不能接受处理。“nbf”索赔要求的处理当前日期/时间或等于后必须在“nbf”中列出的日期/时间。它的值必须是一个包含一个数字日期值。这种说法的使用是可选的。

“iat”(发布)

“iat”(发行)声称智威汤逊广告公司确定的时间。这种说法可以用来确定JWT的年龄。它的值必须是一个包含数字日期值数量。这种说法的使用是可选的。

“jti”(JWT ID)

“jti”(JWT ID)宣称为JWT提供一个惟一的标识符。标识符的值必须分配的方式确保有一个微不足道的概率相同的值将被意外地分配给一个不同的数据对象;如果应用程序使用多个发行者,必须避免碰撞中值所产生的不同的发行人。“jti”声称可以用来防止JWT重播。“jti”值是一个字符串大小写敏感的。这种说法的使用是可选的。

签名

智威汤逊的第三部分是签名。这是最重要的部分JWT验证。正如我们已经看到的,使用负载和密钥生成签名,谁拥有这把钥匙可以产生新的令牌有效签名。你必须确保数据有效载荷是合法的,可以信任一样(至少你确定密钥是保密)。

最常用的加密算法用于生成签名

·HS256算法,它是HMAC-SHA256的缩写

·RS256签名算法,这是RSA-SHA256的缩写

HS256 (对称密钥加密)包括两党之间共享的秘密密钥。这个密钥用于加密的数据接收端,使用相同的密钥来解密数据。HS256签名是使用一个密钥生成验证在接收端(资源服务器)。在接收端,使用有效负载和秘密密钥签名再次生成,而传入的签名JWT的一部分。因为只有认证服务器和资源服务器拥有密钥,不可能脾气JWT令牌,这就是我们可以检查的有效性JWT令牌。

一些是错误的

HS256算法的一个缺点是需要访问密钥生成和验证令牌时。对于单一的应用程序,这不是太多的问题,但是如果你有一个分布式系统的多个服务彼此独立的或相同的云环境中运行多个应用程序节点,基本上需要选择两个非常糟糕的选择:

  • 你可以选择一个专门的服务令牌生成和验证。任何服务,从客户端收到一个令牌需要打电话到身份验证服务令牌验证。这将创建一个繁忙的系统性能瓶颈的身份验证服务。
  • 您可以配置密钥的所有服务,从客户端接收的令牌,这样他们可以验证令牌,而无需调用身份验证服务。但在多个位置增加了密钥被泄露的风险,一旦被破坏攻击者可以生成有效的令牌和模拟系统中的任何用户。

RS256 (对称密钥加密或公钥加密)涉及两个键,一个公钥和一个私钥。用于生成签名的私钥,而公钥用于验证签名。在这种情况下,只有拥有私钥生成JWT令牌的身份验证服务器,我们不再需要分发的私钥。服务器上的资源我们可以利用公钥验证令牌。non-interchangeable两个键,一个只能用于生成和其他只能用于验证。

JSON Web关键组(JWKS)

一个问题出现了,我们如何得到公钥。JSON网络关键(JWKS)是一组键集包含公钥用于验证任何JSON Web标记(JWT)签发的授权。大多数授权服务器暴露发现端点,https://YOUR_DOMAIN/.well-known/openid-configuration。您可以使用该端点配置您的应用程序或JSON Web API来自动定位键设置端点(jwks_uri),其中包含公钥用于签署JWT。

是更安全的

通过应用所有这些东西,你的网络安全是坚如磐石。这里有一些额外的建议,你可以申请更安全。

  1. 验证JWT包含至少一个时期(“。”)字符。
  2. 让编码头的一部分JWT之前第一期(“。”)字符。
  3. Base64url解码编码头后没有换行符的限制,使用空格或其他额外的字符。
  4. 验证结果八隅体序列是一个完全有效的JSON的utf - 8编码。

最后,请注意,这是一个应用程序的决定,算法可用于给定的上下文。即使JWT可以成功地验证,除非JWT的算法是可以接受到应用程序,它应该拒绝JWT。

- - -

- - -

软件开发人员/人

Baidu