乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • JWT 基础

    • JWT 概述
    • JWT 结构详解
  • 签名与加密

    • JWS 签名基础
    • RS256与ES256签名
    • JWE 加密
  • 密钥管理

    • JWK 与密钥管理
  • 算法原理

    • 核心算法详解
  • 实战与安全

    • JWT 实际应用
    • JWT 安全攻防

核心算法详解

广州飞翔科技(learnto.cn)技术团队内部教程 | 作者:小崔(后端开发)审核:白歌(架构师)

JWT(JSON Web Token)的底层依赖一系列精密的密码学算法。本文以通俗易懂的方式,带你理解 Base64、SHA-256、HMAC、RSA 和椭圆曲线(Elliptic Curve)的核心原理,并穿插飞翔科技的真实场景,让抽象的数学变得接地气。


Base64 编码:JWT 的"翻译官"

为什么需要 Base64?

JWT 的头部(Header)和载荷(Payload)都是 JSON 对象,但网络传输中二进制数据容易"乱码"。Base64 的作用就是把任意二进制数据转换成纯文本字符,确保在任何系统间安全传输。

编码原理:6 比特一组

Base64 的核心思想是 把每 3 个字节(24 比特)拆成 4 组,每组 6 比特 :

原始字节: 01100001 01100010 01100011  (abc)
6 比特分组: 011000 010110 001001 100011
对应索引:  24     22     9      35
Base64字符: Y      W      J      j

6 比特能表示 0~63 共 64 种状态,因此需要一张包含 64 个字符的编码表:A-Z、a-z、0-9,再加上 + 和 /,最后以 = 作为填充(Padding)符。

飞翔科技场景 :黄俪(前端开发)在调试乐途商城的 JWT 时,发现令牌里全是乱码。小崔(后端开发)告诉她:"那是 Base64 编码,用 atob() 就能解码看到 JSON 内容。"

Base64URL 变体:为 URL 而生

标准 Base64 有三个字符在 URL 中"不友好":

标准 Base64Base64URL原因
+-+ 在 URL 中表示空格
/_/ 在 URL 中是路径分隔符
=去掉= 是填充符,URL 参数中可能引发解析问题

JWT 规范强制使用 Base64URL ,因此你永远不会在 JWT 字符串里看到 + 或 /。


SHA-256:信息的"指纹机"

什么是安全哈希算法?

SHA-256 (Secure Hash Algorithm 256-bit)是 SHA-2 家族的一员。无论输入是一句话还是一部 4K 电影,它都会输出固定 256 位(32 字节)的哈希值(Hash Value),就像给文件按了一个独一无二的"指纹"。

关键特性 :

  • 单向性 :从哈希值反推原文,计算上不可行
  • 抗碰撞性 :很难找到两段不同原文产生相同哈希值
  • 雪崩效应 :原文改一个标点,哈希值面目全非

SHA-256 的工作流程

SHA-256 内部主要做三件事:

  1. 填充(Padding) :在消息末尾补比特,使其长度 ≡ 448 (mod 512),最后 64 位记录原始消息长度
  2. 分块处理 :把填充后的消息切成 512 比特(64 字节)的块
  3. 64 轮迭代 :每块经过 64 轮压缩函数运算,更新 8 个 32 位状态寄存器

飞翔科技场景 :大翔(CEO)问白歌(架构师):"咱们乐途网盘的文件校验用 MD5 行不行?"白歌摇头:"MD5 已被碰撞攻击破解,文件完整性校验必须上 SHA-256。"


HMAC:带密钥的哈希认证

HMAC 是什么?

HMAC (Hash-based Message Authentication Code)不是简单的"哈希+密钥",而是经过精心设计的 双重哈希 结构,能抵抗多种扩展攻击。

内部原理:K' XOR ipad / opad

HMAC 的核心步骤如下:

  1. 密钥处理 :如果密钥太长,先做一次哈希得到固定长度;太短则补零
  2. 生成两个派生密钥 :
    • K' ⊕ ipad(inner pad,0x36 重复)
    • K' ⊕ opad(outer pad,0x5C 重复)
  3. 双重哈希 :H( (K' ⊕ opad) || H( (K' ⊕ ipad) || message ) )

飞翔科技场景 :小崔给黄俪演示 HS256 签名时,黄俪问:"为什么不能直接把密钥拼在消息前面做 SHA-256?"小崔解释:"那样会被长度扩展攻击(Length Extension Attack)钻空子。HMAC 的内外两层结构就是专门防这个的。"


RSA:非对称签名的基石

整数分解难题

RSA (Rivest–Shamir–Adleman)的安全性建立在 大整数分解难题 (Integer Factorization Problem)之上:把两个大素数相乘很容易,但要把乘积拆回原来的素数,当数字达到上千位时,现有计算机算到宇宙毁灭都算不出来。

RSA 密钥的数学基础

RSA 涉及几个关键概念:

  • 模运算(Modular Arithmetic) :所有运算都在"模 n"的有限世界里进行,结果永远落在 0 ~ n-1 之间
  • 欧拉函数 φ(n) :小于 n 且与 n 互质的正整数的个数。当 n = p×q(两个素数)时,φ(n) = (p-1)(q-1)
  • 公钥 (n, e) 和 私钥 (n, d) :满足 d·e ≡ 1 (mod φ(n))

签名过程 :用私钥对消息哈希值做 s = m^d mod n验证过程 :用公钥对签名做 m = s^e mod n,再与消息哈希比对

为什么 RSA 密钥要 2048 位?

飞翔科技场景 :某天黄俪问小崔:"咱们乐途支付系统的 RSA 密钥为什么非得 2048 位?1024 位不行吗?"

小崔在白板上画了个对比表:

密钥长度大致安全级别现状
1024 位80 位2010 年起已被认为不安全
2048 位112 位当前最低推荐标准
3072 位128 位高安全场景
4096 位140 位极致安全,性能开销大

"1024 位的 RSA 在 2009 年就被集群破解过,"小崔说,"咱们乐途支付每天处理上百万笔订单,用 1024 位等于把金库钥匙挂在门口。2048 位是 NIST(美国国家标准与技术研究院)的底线要求,咱们必须守住。"


椭圆曲线密码学:更轻量的非对称方案

离散对数难题

椭圆曲线密码学 (Elliptic Curve Cryptography, ECC)不依赖整数分解,而是依赖 椭圆曲线离散对数难题 (Elliptic Curve Discrete Logarithm Problem, ECDLP)。

通俗理解:在椭圆曲线上,已知点 G 和点 Q = d·G,要反推出乘数 d,目前没有高效算法能做到。

椭圆曲线的三大运算

椭圆曲线上的所有密码学操作都基于三种基本运算:

  1. 点加(Point Addition) :曲线上两个不同点 P + Q = R,几何上是通过 P、Q 的直线与曲线的第三个交点关于 x 轴的对称点
  2. 点倍(Point Doubling) :P + P = 2P,即切线与曲线的另一个交点的对称点
  3. 标量乘法(Scalar Multiplication) :k·P 就是 P 自加点 k 次,通过"二进制分解+点加倍"高效计算

ECDSA 与 ES256

ECDSA (Elliptic Curve Digital Signature Algorithm)是 JWT 中 ES256 的底层算法。与 RSA 不同,ECDSA 签名产生两个整数 r 和 s ,各转 32 字节后拼接成 64 字节签名。

密钥尺寸对比 :

算法密钥长度等效安全级别
RSA2048 位~112 位
RSA3072 位~128 位
ECC (P-256)256 位~128 位

飞翔科技场景 :白歌在架构评审会上推荐乐途 IoT 设备接入层采用 ES256 而非 RS256。"IoT 设备内存只有几十 KB,"白歌说,"传 2048 位 RSA 公钥太占资源,P-256 的 ECC 公钥只有 65 字节,省下的内存够多跑两个传感器线程。"


算法选择速查表

场景推荐算法理由
单体应用、内部服务HS256速度快,共享密钥管理简单
联邦身份、第三方接入RS256 / ES256公钥可公开分发,私钥保密
高安全金融场景PS256 / RS384PSS 填充更安全
移动端 / IoTES256签名和密钥尺寸小,省带宽省电量

结语

理解 JWT 背后的算法原理,不是为了手写加密库——不要自己实现加密算法(Don't roll your own crypto)——而是为了在选型、排错和安全审计时做出正确判断。正如白歌常说的:"知道轮子怎么转的,才能知道什么时候该换轮子。"

在飞翔科技,从支付网关到 IoT 接入层,不同场景匹配不同算法,这才是专业团队的做事方式。