核心算法详解
广州飞翔科技(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 中"不友好":
| 标准 Base64 | Base64URL | 原因 |
|---|---|---|
+ | - | + 在 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 内部主要做三件事:
- 填充(Padding) :在消息末尾补比特,使其长度 ≡ 448 (mod 512),最后 64 位记录原始消息长度
- 分块处理 :把填充后的消息切成 512 比特(64 字节)的块
- 64 轮迭代 :每块经过 64 轮压缩函数运算,更新 8 个 32 位状态寄存器
飞翔科技场景 :大翔(CEO)问白歌(架构师):"咱们乐途网盘的文件校验用 MD5 行不行?"白歌摇头:"MD5 已被碰撞攻击破解,文件完整性校验必须上 SHA-256。"
HMAC:带密钥的哈希认证
HMAC 是什么?
HMAC (Hash-based Message Authentication Code)不是简单的"哈希+密钥",而是经过精心设计的 双重哈希 结构,能抵抗多种扩展攻击。
内部原理:K' XOR ipad / opad
HMAC 的核心步骤如下:
- 密钥处理 :如果密钥太长,先做一次哈希得到固定长度;太短则补零
- 生成两个派生密钥 :
K' ⊕ ipad(inner pad,0x36 重复)K' ⊕ opad(outer pad,0x5C 重复)
- 双重哈希 :
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,目前没有高效算法能做到。
椭圆曲线的三大运算
椭圆曲线上的所有密码学操作都基于三种基本运算:
- 点加(Point Addition) :曲线上两个不同点 P + Q = R,几何上是通过 P、Q 的直线与曲线的第三个交点关于 x 轴的对称点
- 点倍(Point Doubling) :P + P = 2P,即切线与曲线的另一个交点的对称点
- 标量乘法(Scalar Multiplication) :k·P 就是 P 自加点 k 次,通过"二进制分解+点加倍"高效计算
ECDSA 与 ES256
ECDSA (Elliptic Curve Digital Signature Algorithm)是 JWT 中 ES256 的底层算法。与 RSA 不同,ECDSA 签名产生两个整数 r 和 s ,各转 32 字节后拼接成 64 字节签名。
密钥尺寸对比 :
| 算法 | 密钥长度 | 等效安全级别 |
|---|---|---|
| RSA | 2048 位 | ~112 位 |
| RSA | 3072 位 | ~128 位 |
| ECC (P-256) | 256 位 | ~128 位 |
飞翔科技场景 :白歌在架构评审会上推荐乐途 IoT 设备接入层采用 ES256 而非 RS256。"IoT 设备内存只有几十 KB,"白歌说,"传 2048 位 RSA 公钥太占资源,P-256 的 ECC 公钥只有 65 字节,省下的内存够多跑两个传感器线程。"
算法选择速查表
| 场景 | 推荐算法 | 理由 |
|---|---|---|
| 单体应用、内部服务 | HS256 | 速度快,共享密钥管理简单 |
| 联邦身份、第三方接入 | RS256 / ES256 | 公钥可公开分发,私钥保密 |
| 高安全金融场景 | PS256 / RS384 | PSS 填充更安全 |
| 移动端 / IoT | ES256 | 签名和密钥尺寸小,省带宽省电量 |
结语
理解 JWT 背后的算法原理,不是为了手写加密库——不要自己实现加密算法(Don't roll your own crypto)——而是为了在选型、排错和安全审计时做出正确判断。正如白歌常说的:"知道轮子怎么转的,才能知道什么时候该换轮子。"
在飞翔科技,从支付网关到 IoT 接入层,不同场景匹配不同算法,这才是专业团队的做事方式。