JSON WEB TOKEN安全

2024-06-16 03:32
文章标签 安全 json web token

本文主要是介绍JSON WEB TOKEN安全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0x00 JWT是什么
JWT全称JSON WEB Token,可以理解为一个小型的协议,用于客户端和服务端可靠地传输数据。
一个JWT串(来自maimai)实际上长成这个样子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1IjozNDcyMjU4NiwiaWQiOjc3Mjk3NTl9.I3p2MonJyAAMdsk4VyKgrQT6jal4jJSJv09BCbzOcNw
是一个以点号分割的三个子串拼接起来的。
JWT串的组成分为三个部分:
(1)头部
{
"typ": "JWT",
"alg": "HS256"
}
alg用于指定后端用什么方式进行签名校验,默认使用的是HS256,也就是HMAC-SHA256。将上面的串进行base64编码后作为真正填充的头部。

(2)载荷
这里的载荷其实就是一些用户数据的声明,分为公有声明、私有声明、注册声明。可以理解为K-V形式的用户数据存储。比如:
{
"iat": 1441593502,
"username": "admin"
}
将上面的串进行base64编码后作为真正填充的载荷。

(3)签名
签名是有很多种算法考虑的,有哈希也有非对称加密方式。这里是对base64后的头和载荷进行签名计算,计算完成后base64一遍然后用点号拼接到JWT串的最后面。

当服务器端收到一个JWT串时,毫无疑问首先要对其进行分解,之后根据头部提供的方式来进行签名校验,校验无误之后再进行后续的操作。

0x01 安全问题
和当年的OAuth2.0协议一样,虽然RFC规定的还不错,但是业务上实现的时候容易出疏漏。
有两个问题:
(1)签名方式为None
历史上很多类库支持设置签名方式为None的情况,比如下面这种:
{
"typ": "JWT",
"alg": "None"
}
比如历史上py-jwt实现中,就有这个问题:

攻击方法很简单,将header部分的alg改为None,然后将签名部分删除掉,形如:
xxxxxx.xxxxxx.
然后提交,就可以绕过签名机制。

(2)使用非对称加密方式
如果在后端的签名校验中,使用了RSA算法,即私钥加密,公钥解密的方式实现签名校验。但是有一个问题,攻击者可以在前端指定任意签名算法,如果这时候指定为HMAC-SHA256的方式,后端校验解密签名的时候实际上用的key就是公钥,而这个公钥一般在客户端都可以拿到。那么,就可以让攻击者在客户端用这个公钥伪造一个签名,从而绕过这个校验机制。

相关文章:
http://www.openwall.com/lists/oss-security/2015/04/01/4
https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
http://blog.websecurify.com/2017/02/hacking-json-web-tokens.html
http://blog.leapoahead.com/2015/09/06/understanding-jwt/
http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/

这篇关于JSON WEB TOKEN安全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065364

相关文章

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

9 个 GraphQL 安全最佳实践

GraphQL 已被最大的平台采用 - Facebook、Twitter、Github、Pinterest、Walmart - 这些大公司不能在安全性上妥协。但是,尽管 GraphQL 可以成为您的 API 的非常安全的选项,但它并不是开箱即用的。事实恰恰相反:即使是最新手的黑客,所有大门都是敞开的。此外,GraphQL 有自己的一套注意事项,因此如果您来自 REST,您可能会错过一些重要步骤!

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展:人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点:数据的管理者(DBMS);数据结构化;数据共享性高,冗余度低,易于扩充;数据独立性高。DBMS 对数据的控制功能:数据的安全性保护;数据的完整性检查;并发控制;数据库恢复。 数据库技术研究领域:数据库管理系统软件的研发;数据库设计;数据库理论。数据模型要素 数据结构:描述数据库

使用JWT进行安全通信

在现代Web应用中,安全通信是至关重要的。JSON Web Token(JWT)是一种流行的安全通信方式,它允许用户和服务器之间安全地传输信息。JWT是一种紧凑的、URL安全的表示方法,用于在两方之间传输信息。本文将详细介绍JWT的工作原理,并提供代码示例帮助新人理解和实现JWT。 什么是JWT? JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSO

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

JavaWeb 学习笔记 spring+jdbc整合开发初步

JdbcTemplate类是Spring的核心类之一,可以在org.springframework.jdbc.core中找到它。JdbcTemplate类在内部已经处理数据库的建立和释放,可以避免一些常见的错误。JdbcTemplate类可直接通过数据源的应用实例化,然后在服务中使用,也可在xml配置中作为JavaBean应用给服务使用直接上一个实例步骤1.xml配置 <?xml version

直接得到Json串,转换为字典

0.新创建一个json文件,把json串拷贝到里面 1.先通过MainBundle找到资源对应的路径 2.将文件转换为NSData 3.通过NSJSonSerization得到字典 NSString*fileName=[[NSBundle mainBundle] pathForResource:@"myJson" ofType:@"json"];           NS

php json_encode 大括号中括号

当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串。 而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串。 当字符串为[1,1,1] 这种模式时,json_decode默认解析出来的结果是一个数组。 当字符串为{"1":1,"2":1} 这种模式时,json_

Web容器启动时加载Spring分析

在应用程序web.xml中做了以下配置信息时,当启动Web容器时就会自动加载Spring容器。 [java]  view plain copy print ? <listener>          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>