当前位置: 首页 > news >正文

JWT加密解密

JWT (JSON Web Token) 是一种用于在各方之间安全地传输信息的紧凑、自包含的令牌。它由 三个部分 组成:HeaderPayloadSignature,它们使用 . 分隔,如下所示:

header.payload.signature

1. JWT 的构成

Header(头部)

Header 包含两个主要部分:

  • 类型typ,即声明这是一个 JWT。
  • 签名算法alg,例如 HMAC、RSA 等。

示例:

json复制代码{"alg": "HS256","typ": "JWT"
}

编码(Base64Url 编码)后的 Header:

复制代码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload(负载)

Payload 包含声明(Claims),即要传输的数据信息。声明可以是标准的注册声明,也可以是自定义的声明。

示例:

{"aud": "123",             // 用户ID"info": "example_info",    // 自定义信息"exp": 1728788687          // 过期时间 (UNIX时间戳)
}

编码后的 Payload:

复制代码
eyJhdWQiOiIxMjMiLCJpbmZvIjoiZXhhbXBsZV9pbmZvIiwiZXhwIjoxNzI4Nzg4Njg3fQ
Signature(签名)

Signature 是将 Header 和 Payload 编码后,通过签名算法(如 HMAC SHA256)以及密钥(secret)生成的。

生成签名的过程:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret
)

假设密钥为 mysecret,生成的 Signature 会是:

复制代码
3zkrxI4OSQztHk9H0O1DsX9hwppCu3lIjGt7E4jA8To

最终的 JWT 是:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIxMjMiLCJpbmZvIjoiZXhhbXBsZV9pbmZvIiwiZXhwIjoxNzI4Nzg4Njg3fQ.3zkrxI4OSQztHk9H0O1DsX9hwppCu3lIjGt7E4jA8To

2. JWT 的加密和解密流程

加密(生成 Token)流程:
  1. Header 和 Payload 的编码:将 Header 和 Payload 转换为 JSON 字符串,并使用 Base64Url 编码。
  2. 生成签名:使用 base64UrlEncode(header) + "." + base64UrlEncode(payload),结合密钥和签名算法,生成签名。
  3. 拼接 Token:将 Header、Payload 和 Signature 拼接起来,构成完整的 JWT Token。
解密(验证 Token)流程:
  1. 提取 Header 和 Payload:从 JWT 中分离出 Header 和 Payload 并解码。
  2. 重新计算签名:使用 JWT 中的 Header 和 Payload,按照与生成签名时相同的方式重新计算签名。
  3. 校验签名:将重新计算的签名与 JWT 中的签名部分进行比较。如果相同,表示数据未被篡改;如果不同,表示数据已被篡改。

3. 如何确保 JWT 没有被篡改?

  • 当 JWT 被生成后,其签名是基于 HeaderPayload密钥 共同生成的。
  • 每次验证 JWT 时,服务器会使用与生成时相同的密钥,重新计算签名,并与 Token 中的签名进行比较。如果两者匹配,说明 Token 的数据没有被修改。

例如,如果有人修改了 JWT 的 Payload 部分(如用户 ID),签名的校验就会失败,因为修改后的 Payload 和原始密钥生成的签名不会匹配 JWT 中已有的签名。

举例说明:

  1. 假设我们生成了一个 JWT,内容如下:

    复制代码
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiIxMjMiLCJpbmZvIjoiZXhhbXBsZV9pbmZvIiwiZXhwIjoxNzI4Nzg4Njg3fQ.3zkrxI4OSQztHk9H0O1DsX9hwppCu3lIjGt7E4jA8To
    
  2. 现在我们试图篡改 Payload,将 aud123 改为 456。篡改后的 JWT:

    复制代码
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiI0NTYiLCJpbmZvIjoiZXhhbXBsZV9pbmZvIiwiZXhwIjoxNzI4Nzg4Njg3fQ.3zkrxI4OSQztHk9H0O1DsX9hwppCu3lIjGt7E4jA8To
    
  3. 当服务器验证时,会用新的 Payload 重新计算签名。由于 Payload 改变了,重新计算的签名将不会与原签名匹配,因此验证失败,说明 Token 被篡改。

4. 什么情况下会被判定为篡改?

  • Payload 或 Header 被修改:如前述示例所示,如果篡改了 JWT 的 Payload(用户信息、自定义数据等),重新计算的签名将不匹配原始签名,验证失败。
  • 使用不同的密钥:如果有人试图使用与原始密钥不同的密钥生成签名,验证时也会失败,因为解密时会使用正确的密钥进行校验。

总结

JWT 通过签名确保了 Token 的完整性,签名依赖于密钥和算法,因此只要签名匹配,便能确定 Token 未被篡改。如果 Token 的数据(Header 或 Payload)被篡改,签名将不匹配,校验失败,从而保障了 JWT 的安全性。


http://www.mrgr.cn/news/58036.html

相关文章:

  • 听一听语音助手的声音
  • 【LeetCode】每日一题 2024_10_24 找到连续赢 K 场比赛的第一位玩家(模拟/脑筋急转弯)
  • Shell脚本:模块引用
  • Unity3D功耗和发热分析与优化详解
  • 并发面试题-谈谈你对AQS的理解
  • 基于微信小程序的智能校园社区服务推荐系统
  • 【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
  • 深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
  • opencv深度学习:面部特征点匹配与图像融合--换脸
  • 二、Python的五种容器和函数(有C语言基础速成版)
  • 异次元v4.0
  • [MySQL#1] database概述 | 常见的操作指令 | MySQL架构 | 存储引擎
  • 使用微信小程序实现登录
  • 【 thinkphp8 】00008 thinkphp8数据查询,常用table,name方法,进行数据查询汇总
  • 大话红黑树之(2)源码讲解TreeMap-Java
  • 基于Java的高校毕业生就业信息管理系统
  • DAY16
  • N-gram 详解
  • 【1024程序员节】:希望再无BUG
  • html小游戏-飞机大战
  • C++之模板进阶
  • 洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南
  • DOTween动画插件超详解(保姆级巨细)
  • Java项目-基于springboot框架的人职匹配推荐系统项目实战(附源码+文档)
  • QImage和QPixmap
  • 大数据Azkaban(二):Azkaban简单介绍