轻松学会使用JWT,让你的OAuth2.0实现更加安全高效!

授权服务的核心:颁发访问令牌,而OAuth 2.0规范没有约束访问令牌内容的生成规则,只要符合:

  • 唯一性
  • 不连续性
  • 不可猜性

可灵活选择令牌形式:

  • 既可是没有内部结构 && 不包含任何信息含义的随机字符串
  • 也可是具有内部结构 && 包含有信息含义的字符串

以前生成令牌的方式都是默认一个随机字符串。而结构化令牌,目前用得最多的就是JWT令牌。

1 简介

JSON Web Token(JWT)是一个开放标准(RFC 7519),定义了一种紧凑、自包含的方式,作为JSON对象在各方之间安全地传输信息,结构化封装的方式生成token。 结构化后的token可被赋予丰富含义,这是与无意义的随机字符串形式token的最大区别。

2 JWT结构

例如:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

jwt.io/网站中解密得到

在这里插入图片描述

→点击获取网络安全资料·攻略←

200多本网络安全系列电子书
网络安全标准题库资料
项目源码
网络安全基础入门、Linux、web安全、攻防方面的视频
网络安全学习路线图

2.1 HEADER(头部)

装载令牌类型和算法等信息:

  • typ 表示第二部分PAYLOAD是JWT类型
  • alg 表示使用HS256对称签名的算法

2.2 PAYLOAD(数据体)

代表一组数据:

  • sub 令牌的主体,一般设为资源拥有者的唯一标识
  • exp 令牌的过期时间戳
  • iat 令牌颁发的时间戳

是JWT规范性的声明,PAYLOAD表示的一组数据允许我们自定义声明。

2.3 SIGNATURE(签名)

签名后的JWT整体结构,是被.分割的三段内容:header.payload.signature。JWT令牌直接用肉眼,看起来还是毫无意义,拷贝到 jwt.io/ 在线校验,即可看到解码后的有意义数据。

SIGNATURE表示对JWT信息的签名。

作用

有了HEADERPAYLOAD就可让令牌携带信息在网络中传输,但网络中传输这样的信息体不安全。须加密签名,SIGNATURE就是对信息的签名结果,当受保护资源接收到三方软件的签名后需要验证令牌的签名是否合法。

3 令牌内检

3.1 定义

既然授权服务颁发令牌,受保护资源服务就要验证令牌。而受保护资源调用授权服务提供的检验令牌的服务的这种校验令牌方式就叫令牌内检。

3.2 特点

有时授权服务依赖DB,然后受保护资源服务也依赖该DB,即“共享DB”。

微服务架构下,不同系统间依靠服务而非DB通信,如【授权服务】给【受保护资源服务】提供一个RPC服务:

JWT令牌本身包含了之前所要依赖DB或依赖RPC服务才能拿到的信息,如某用户为某软件进行授权等信息。

4 JWT实现方案

有JWT令牌后的通信方式: 在这里插入图片描述

授权服务发个令牌,受保护资源服务接令牌,然后开始解析令牌所含信息,无需再去查询DB或RPC调用。即实现了令牌内检。

4.1 HMAC 流程

Hash-based Message Authentication Code,基于哈希函数的消息认证码。验证数据完整性和真实性,通常使用一个共享密钥来计算并验证消息认证码。

在这里插入图片描述

  1. 使用Base64算法将header和payload进行编码,并用"."串联成一个字符串
  2. 使用secret key对上一步得到的字符串进行HMAC签名操作,生成一个签名值
  3. 将签名值也进行Base64编码,与JWT的header和payload一起组成最终的JWT。

接收方在验证JWT时需按照相同的流程计算签名值并将其与JWT中的签名值进行比较,如果相同则表明JWT是有效的。由于签名值的生成过程需要使用密钥,因此只有持有密钥的人才能正确地计算签名值,从而保证JWT安全性。

4.2 RSA 流程

Rivest-Shamir-Adleman,一种公钥加密算法,也可用于数字签名。

基于两个大质数的乘积难以分解这一数学难题,利用公钥和私钥配对实现信息的加密和解密,广泛应用于网络安全、数字签名、电子商务等领域。

在这里插入图片描述

  1. 使用Base64算法将header和payload进行编码,并用"."串联成字符串
  2. 使用private key对上一步得到的字符串进行RSA签名操作,生成一个签名值
  3. 将签名值进行Base64编码,与JWT的header和payload一起组成最终的JWT。

接收方验证JWT时:

  1. 从JWT解析出签名值
  2. 使用public key对JWT的header和payload进行RSA验签操作,得到一个验证结果
  3. 将该结果与JWT中的签名值进行比较,如果相同则表明JWT是有效的

由于私钥只有签发者拥有,因此只有签发者才能正确地给JWT进行签名,而任何人都可以使用公钥进行验签,从而保证了JWT的安全性和可信度。

→点击获取网络安全资料·攻略←

200多本网络安全系列电子书
网络安全标准题库资料
项目源码
网络安全基础入门、Linux、web安全、攻防方面的视频
网络安全学习路线图

5 为什么令牌要编码且签名?

授权服务颁发JWT后给到xx软件,xx拿着令牌请求受保护资源服务,即我在公众号里的文章。显然令牌要在公网传输。 所以传输过程令牌还要做到:

  • 编码,防乱码
  • 签名及加密,以防数据信息泄露。

jjwt 开源的JWT工具,封装了Base64URL编码和对称HMAC、非对称RSA的一系列签名算法。使用它可方便生成一个经过签名的JWT令牌及解析一个JWT令牌。

 // 密钥
 String sharedTokenSecret="hellooauthhellooauthhellooauthhellooauth";
 Key key = new SecretKeySpec(sharedTokenSecret.getBytes(),
                 SignatureAlgorithm.HS256.getJcaName());
 ​
 // 生成JWT令牌
 String jwts=
 Jwts.builder()
  .setHeaderParams(headerMap)
  .setClaims(payloadMap)
  .signWith(key,SignatureAlgorithm.HS256)
  .compact()
 ​
 // 解析JWT令牌
 Jws<Claims> claimsJws =Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jwts);
 JwsHeader header = claimsJws.getHeader();
 Claims body = claimsJws.getBody();

6 优点

6.1 计算代替存储

时间换空间。 这种计算并结构化封装,减少了“共享DB” 因远程调用而带来的网络传输性能损耗,所以可能节省时间。

6.2 加密

因JWT令牌内部已包含重要信息,所以传输过程都必须被要求密文传输,被强制要求加密也保障了传输安全性。

6.3 增强系统可用性和可伸缩性

JWT令牌通过“自编码”包含身份验证所需信息,无需服务端额外存储,所以每次的请求都是无状态会话。符合尽可能遵循无状态架构设计原则,增强了系统可用性和伸缩性。

6.4 降低 AuthServer 压力

客户端获取令牌后,后续资源服务器可做自校验,无需到AuthServer校验。

6.5 简化AuthServer实现

无需对用户状态会话进行维护和管理

7 缺点

7.1 无状态和吊销无法两全

无法在使用过程中修改令牌状态。比如我在使用xx时,可能莫须有原因修改了在公众号平台的密码或突然取消了给xx的授权。这时,令牌状态就该有变更,将原来对应令牌置无效。但使用JWT时,每次颁发的令牌都不会存在服务端,无法改变令牌状态。这表示JWT令牌在有效期内都会畅通无阻。

那可以把JWT令牌存储在一个分布式内存数据库,如Redis吗? NO!这违背JWT意义 - 将信息结构化存入令牌本身。通常有两种方案:

  1. 将每次生成JWT令牌时的密钥粒度缩小到用户级别,即一个用户一个密钥 如此,当用户取消授权或修改密码,可让该密钥一起修改。这种方案一般还需配套单独密钥管理服务
  2. 在不提供用户主动取消授权的环境里面,若只考虑修改密码场景,即可把用户密码作为JWT的密钥。这也是用户粒度。这样用户修改密码也就相当于修改了密钥。

7.2 网络传输开销

随 claims 增多而增大。

8 令牌的生命周期

令牌都有【有效期】,只是JWT可将有效期的信息存在自身结构中。

OAuth 2.0的令牌生命周期:

  1. 令牌自然过期 在这里插入图片描述

该过程不排除主动销毁令牌的可能,比如令牌被泄露,授权服务可让令牌失效。

  1. 访问令牌失效后可使用刷新令牌请求新令牌,提高用户使用三方软件的体验。
  2. 让三方软件比如xx,主动发起令牌失效请求,然后授权服务收到请求后让令牌立即失效。 何时需要该机制? 比如用户和三方软件间存在一种订购关系:我购买了xx软件,那么到期或退订时且我授权的token还未到期时,就需这样一种令牌撤回协议,支持xx主动发起令牌失效请求。作为开放平台,有责任的三方软件也应该遵守这样的令牌撤回协议。 在这里插入图片描述

9 总结

OAuth 2.0 的核心是授权服务,没有令牌就没有OAuth,令牌表示授权后的结果。令牌在OAuth 2.0系统中对于第三方软件都是不透明的。需要关心令牌的,是授权服务和受保护资源服务。

  1. JWT默认不加密,但也可加密。生成原始 Token 后,可用密钥再加密一次
  2. JWT不加密时,不能将秘密数据写入JWT
  3. JWT不仅可用于认证,也可以用于交换信息。有效使用 JWT,可降低服务器查询数据库的次数
  4. JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。即一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外逻辑
  5. JWT本身包含认证信息,一旦泄露,任何人都能获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证
  6. 为减少盗用,JWT 不应使用 HTTP 协议明码传输,要使用 HTTPS 协议传输

参考

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

  • 2023届全国高校毕业生预计达到1158万人,就业形势严峻;

  • 国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。
在这里插入图片描述

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要保存下方图片,微信扫码即可前往获取

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值