←TuringBlog

Ed25519 签名信封

一份放在用户机器上的授权名册,怎么做到「用户看得见、但改不了」。 全程在你的浏览器里用 WebCrypto 完成,不联任何后端,私钥也不离开这个页面。 原理见 云端功能开关 + Ed25519 离线兜底。

  1. 生成一对密钥(私钥归「管理员」,公钥内置进「客户端」)
  2. 对左边那份 JSON 签名,得到一个 {alg, sig, payload} 信封
  3. 在信封里改任何一个字符,再点验签 —— 看它怎么当场整份失效

① 密钥对 私钥永不进客户端

还没生成

真实项目里:公钥抄进客户端源码,私钥离线保管、绝不进仓库。

② 要签的名册 payload

随便改,改完重新签一次即可。

规范化序列化 canonicalize

签的是字节,不是对象。两端必须从同一个对象产出完全相同的字节,所以 key 要排序、空格要去掉。

—

对象的 key 排序,数组不排——数组顺序是数据的一部分。

③ 签名信封 可以随便改

这份 JSON 会随扩展发给每一个用户。他能读、能改——但改完就验不过。

还没验

客户端会怎么处置 整份拒绝

验签失败不是「忽略被改的那一条」,而是整份名册作废, 退回写死在代码里的基线常量。局部信任是没有意义的——签名覆盖的是整个 payload。
—

基线常量不读任何文件、不查任何存储。无论前面出什么问题,最差就是回到它。

运行日志

(点左边的按钮开始)