怎样相信JWT是真实的?

在这篇文章中,我将分享一些关于JWT令牌的知识。具体来说,我将讨论JWT的结构,以及如何通过验证签名来信任令牌中的信息是真实的。

JWT令牌的结构。

Json Web Token(JWT)包含某些声明或事实,例如颁发者,用户,访问类型和其他特定于应用程序的属性。假设令牌有效,应用程序根据令牌中的事实或声明授予或拒绝访问权限。

签名的JWT令牌由三部分组成:头部,有效负载和签名。各个部分用点分开。下面是我从jwt.io获取的令牌的示例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT令牌的每个部分都是base64编码的。例如,如果您获取标头:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9,并将其提供给base64解码器功能,则会得到以下内容:{"alg":"HS256","typ":"JWT"}表示令牌是JWT令牌,并使用HMAC-SHA256算法对其进行签名。

JWT标题

标题基本上告诉您JWT是否已签名。如果令牌未签名,则“alg”的值将为“none”。如果它已签名,则该值将指示用于对令牌进行签名的算法类型,如上例所示。验证令牌时,应确保令牌具有有效签名,否则请勿接受。

JWT有效载荷

根据令牌的类型,有效负载可能包含不同类型的信息,我们称之为声明。例如,如果JWT是id令牌,则声明可能包含有关用户的信息,包括用户名,id,电子邮件,姓名等...如果JWT是访问令牌,则声明还可以包括范围,角色,受众,等等...... JWT还可能包含特定于发行者或应用程序的自定义声明。例如,Azure AD允许您通过修改应用程序清单来定义自定义声明。所有索赔都是可选的。但其中一定数量已成为标准。有关标准声明的列表,请查看此Wiki文档JWT手册的 3.2.1注册声明部分。

下面我展示了Microsoft Azure Active Directory发布的示例访问令牌。

{
  "aud": "api://bafd76b5-ccb0-4e81-****-************",
  "iss": "https://sts.windows.net/91db64d0-e9d0-43a4-a34b-************/",
  "iat": 1560128459,
  "nbf": 1560128459,
  "exp": 1560132359,
  "acr": "1",
  "aio": "ATQAy/8LAAAAna3Zp9so64X3zDBfw1omazGdFgA+7aU/pqZ4C1K6Dg282U8h0rrv7AQ2NpW11QGu",
  "amr": [
    "pwd"
  ],
  "appid": "546e1552-cd97-48d1-****-************",
  "appidacr": "0",
  "family_name": "John",
  "given_name": "Doe",
  "hasgroups": "true",
  "ipaddr": "216.65.***.***",
  "name": "John Doe",
  "oid": "29c94cd3-f78c-4470-****-************",
  "onprem_sid": "S-1-5-21-1543824733-581343488-**********-*****",
  "roles": [
    "Admin"
  ],
  "scp": "",
  "sub": "FV-j2XdynjmjHq3VU5OwlmcqzXgGw**********_***",
  "tid": "91db64d0-e9d0-43a4-a34b-************",
  "unique_name": "johndoe@email.com",
  "upn": "johndoe@email.com",
  "uti": "zmDgejHyj0apCH********",
  "ver": "1.0"
}

让我们看看上面例子中的一些声明。

  • aud - audience:这表示目标web api可以验证此访问令牌并授予用户 - John Doe访问api。
  • iss - issuer:这表示发布访问令牌的颁发者。在这种情况下,Azure Active Directory是颁发令牌的服务。
  • iat - issue at:这表示AAD发出令牌的时间。在这种情况下,令牌发布于:格林威治标准时间2019年6月9日星期日8:03:50。
  • nbf - 不在之前:这表示令牌有效的最早时间。如果时间早于nbf中的值,则令牌无效。在示例中,nbf = iat,这意味着令牌在发布时立即生效。但是,nbf可能大于iat。例如,您可以提前发出访问令牌,但直到稍后才激活它。有关详细信息,请参阅此帖子
  • exp - expire:表示令牌过期的时间。上述令牌将于2019年6月9日星期日格林尼治标准时间9:08:50到期。因此,令牌在发布时间后的一小时五分钟内有效。过期后,不应再接受令牌。
  • amr - 身份验证方法参考:客户端如何进行身份验证?在这种情况下,客户端使用用户名和密码进行身份验证。根据openid连接规范,“使用此声明的各方需要就所使用的值的含义达成一致,这可能是特定于上下文的。amr值是一个区分大小写的字符串数组“。
  • sub - Subject:令牌断言信息的主体。根据Microsoft的文档,此值特定于特定的应用程序ID。例如,“如果单个用户使用两个不同的客户端ID登录两个不同的应用程序,那么这些应用程序将收到两个不同的主题声明值”。
  • scp - 作用域:这是一组值,用于定义具有访问令牌的应用程序可以代表用户访问的资源和权限的种类。在OAuth2协议之后,当客户端代表用户请求访问令牌时,授权服务器应向用户显示一个同意屏幕,其中列出了应用程序请求的范围。用户需要给出同意,表明可以授予应用程序对范围所指示的资源的访问权限。

示例中的某些其他声明特定于Azure Active Directory。有关它们的详细信息,请查看文档

id令牌的有效负载类似于访问令牌的有效负载。id令牌具有更多关于用户的声明,而不是授权。下面显示了Microsoft Azure Active Directory发出的id令牌的示例。

{
  "aud": "546e1552-cd97-48d1-a9f4-************",
  "iss": "https://login.microsoftonline.com/91db64d0-e9d0-****-****-************/v2.0",
  "iat": 1560128457,
  "nbf": 1560128457,
  "exp": 1560132357,
  "aio": "ATQAy/8LAAAA7U6jE1sIGgx/SMN5yYGYEJJvEx+u4GoMMLP5OTDfs4j1wcCPa/*************",
  "name": "John Doe",
  "nonce": "19e9904a-46b4-4dfe-a7a7-f068a637d1a2",
  "oid": "29c94cd3-f78c-4470-89df-************",
  "preferred_username": "johndoe@email.com",
  "sub": "8V2XFRo4ea8GYl7are8FanR7vFNn6HnhO_*********",
  "tid": "91db64d0-e9d0-43a4-a34b-************",
  "uti": "39Un3zlE-*************",
  "ver": "2.0"
}

请注意'oid'的值,它与访问令牌中的值相同。根据Microsoft的文档,“此ID可以跨应用程序唯一标识用户 - 在同一用户中签名的两个不同应用程序将在oid声明中获得相同的值”。

JWT签名

JWT的最后一部分是签名。安全的JWT必须始终包含签名。针对JWT的一些攻击包括剥离签名并使JWT成为未签名的JWT。所以你应该总是确保JWT有一个有效的签名。

存在用于签署包括HS256,RS256和ES256的JWT的若干算法。根据JSON Web算法(JWA)规范,实现必须支持HS256。该规范还推荐了另外两种算法:RS256和ES256。其他算法是可选的。

签署JWT主要有两种不同的方式。第一种方法是使用密钥散列消息认证码(HMAC)。HMAC实质上意味着使用共享密钥来签名和验证签名。基本上,一旦使用密钥对JWT进行签名/加密,您需要知道能够解密令牌的密钥。这意味着,如果您的应用程序拥有密钥,并且您能够使用密钥解密令牌,则您知道该令牌已由预期的颁发者签名,并且未被篡改。但是,对于HMAC,泄露秘密的机会随着您需要支持的客户数量而增加。HS256(HMAC + SHA-256)是一种使用HMAC的算法。

签署JWT的第二种方式是使用公钥/私钥对。RS256(RSASSA + SHA256)是一种使用公钥/私钥对的算法。例如,在RSA算法的变体中,发行者拥有私钥,并且每个消费者获得公钥。使用公钥,消费者可以验证签名,从而验证JWT的真实性。但是,使用者无法使用公钥创建消息。因此,在共享密钥上使用公钥/私钥对的优点在于公钥/私钥中泄露秘密密钥的风险较小,因为您不需要与消费者共享密钥。在RSA算法的另一个变体中,公钥可以用于加密令牌,并且只有私钥可以用于解密它。

您可以在JWT手册中找到有关这些算法的详细讨论。

Azure AD使用公钥/私钥对进行签名和验证JWT。

Azure AD使用由公钥和私钥对组成的签名密钥。当用户登录使用Azure AD进行身份验证的应用程序时,Azure AD会创建一个安全令牌,其中包含有关该用户的信息。在将Azure发送回应用程序之前,此标记由Azure AD使用其私钥签名。要验证令牌是否有效并且源自Azure AD,应用程序必须使用Azure AD公开的公钥来验证令牌的签名,该公钥包含在租户的OpenID Connect发现文档或SAML / WS-Fed 联合元数据文档中

在Azure Active Directory中签名密钥翻转

你怎么能相信JWT是真实的?

如果您可以验证其签名,您可以信任JWT是真实的。例如,Azure AD使用公钥/私钥对进行签名和验证访问令牌。当您的API从AAD收到ID或访问令牌时,令牌的标头包含获取公钥的信息。

{"typ":"JWT","alg":"RS256","kid":"CtfQC8Le-8NsC7oC2zQkZpcrfOc"}

在上面的json中,“kid”是公钥的id,可用于验证令牌。您可以通过访问此公共端点来验证公钥是否存在并获取实际密钥:https//login.microsoftonline.com/common/discovery/keys

此外,如果您已有权访问公钥,则无需联系授权服务器即可验证令牌。也许,您的应用程序可以调用以检索公钥并将其缓存以供后续使用。请记住,AAD等服务会出于安全目的而转动密钥。如果您使用AAD,请查看文档

携带签名的访问令牌(例如签名的JWT)可以由资源服务器自己验证。为此,无需联系授权服务器。

转:https://medium.com/@taithienbo/how-can-you-trust-a-jwt-to-be-authentic-2bd5124b243a

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容