签名购买授权(Mandate)原理详解:ed25519与一次性nonce如何守护你的钱包

发布时间:2026/10/6 13:20:24

签名购买授权(Mandate)原理详解:ed25519与一次性nonce如何守护你的钱包 签名购买授权(Mandate)原理详解ed25519与一次性nonce如何守护你的钱包【免费下载链接】northcinderBuyer-run, ad-neutral shopping-agent MCP software with deterministic ranking, signed purchase mandates, and a local audit trail.项目地址: https://gitcode.com/gh_mirrors/no/northcindernorthcinder 是一款由买家自己掌控、天然屏蔽广告干扰的购物Agent软件它的核心承诺只有一条任何一笔购买都必须经过你本人的签名购买授权Mandate。这份授权以 ed25519 密码学签名作为防伪印章以一次性 nonce 作为一次性凭证从密钥生成、授权签发到逐项验证全链路本地完成、可审计、可验证。接下来我们一起拆解这套签名购买授权机制是如何一步步守护你的钱包的。购物Agent为何需要签名购买授权先看懂Mandate是什么传统购物助手替你下单时通常只有你点了确认这一层薄弱的信任。而 northcinder 把信任升级成了可验证的密码学承诺每一次结账前软件会在你本机生成一份结构化的授权文件——Mandate。这份 Mandate 明明白白写清了五件事买什么对应的商品 offerId从哪买目标商家 merchantId最多花多少包含运费的金额硬上限maxAmount多久有效签发时间与过期时间默认 15 分钟是否唯一一个随机生成的一次性 nonce只要其中任何一项在签名之后被人篡改验证环节就会立刻判它无效。这份数据结构的定义位于packages/protocol/src/schemas/core.ts而签发与验证逻辑全部封装在packages/checkout/src/mandate/目录下。ed25519密钥对私钥永不出本机的本地签名方案签名购买授权靠的是 ed25519 非对称加密——一把私钥负责签字一把公钥负责验签。northcinder 采用了一个对钱包非常友好的设计私钥永远不出你的电脑。首次运行时软件在配置目录自动生成 ed25519 密钥对见packages/checkout/src/mandate/keystore.ts私钥文件权限被强制设为0600即仅本人可读写因为它直接关系到花钱授权代码中私钥被封装成sign()闭包任何其他模块都无法直接读取私钥内容生成的公钥Base64 编码会随 Mandate 一起提供给商家侧或验证方用于核对签名真伪。也就是说签名是你本机私钥的专属动作全世界只有你的电脑能签出这份授权。规范化签名载荷一份顺序固定的防篡改清单密码学签名有个关键细节签名是针对一串字节算出来的如果同一份内容换一种排列顺序签名就会对不上。为了避免同一个授权被重排字段后仍然有效的漏洞northcinder 在packages/checkout/src/mandate/canonical.ts中把待签内容规范化为固定字段顺序的 JSON 数组先是版本化域名标记northcinder.purchase-mandate.v1用于区分不同版本的协议再按固定顺序排列授权 ID、意图描述、offerId、商家、金额上限、币种、签发时间、过期时间、nonce签名时签的就是这份标准清单验证时也按同一份清单重新计算。任何字段的增删改都会导致签名校验失败——这就是防篡改的第一道闸门。代码还保留了旧版本域名如brier、thenagain、emptor前缀保证升级前签发的历史授权仍可验证。一次性nonce如何拦截重放攻击文件锁定的原子魔法签名能证明这份授权确实是你签的却无法证明这份授权只被用一次。想象一下如果一份有效授权可以反复提交攻击者截获后就能不断用它下单。这就是重放攻击Replay Attack而拦截它的武器就是一次性 nonce。每个 Mandate 都携带一个随机生成的 nonce至少 16 位随机字符并且遵循一条铁律一个 nonce 只能被消费一次。packages/checkout/src/mandate/nonce-ledger.ts实现了一次性台账其核心机制非常巧妙用 SHA-256 把 nonce 哈希成一个固定文件名在台账.markers/目录下以O_EXCL原子方式创建对应的标记文件权限0600文件创建成功 这个 nonce 被我烧掉了文件已存在EEXIST 这个 nonce 已经被用过由于O_EXCL创建在文件系统层面是原子操作哪怕多个进程同时提交同一个 nonce也只有一个能赢。这样的设计保证了跨进程、跨实例都无法重复使用同一份授权同时所有消费记录会以 JSONL 追加写入审计日志随时可查。验证全流程签名校验、金额比对与nonce消费的先后次序签名购买授权最终要经过packages/checkout/src/mandate/verify.ts这道硬门禁所有检查按严格顺序执行检查项作用结构校验授权格式是否符合协议 Schema密钥信任签名公钥是否来自你本机的受信任密钥签名校验ed25519 签名是否与规范化载荷匹配时效校验是否仍在 15 分钟有效期内商品匹配offerId 与当前商品是否一致商家匹配merchantId 与当前商家是否一致金额上限含运费总价是否超出签名的 maxAmountnonce 消费最后一步才烧掉一次性 nonce注意这里的顺序大有讲究所有校验通过后才在最后一步消费 nonce。这样设计意味着——如果验证失败nonce 不会被浪费授权还可以修正后重试而一旦验证成功nonce 立即被消费绝不给二次使用留机会。任何异常都会返回结构化的拒绝原因如signature_invalid、expired、amount_exceeded、replayed并且永远不会抛出未处理的异常。15分钟有效期金额上限给钱包上的双重保险即使签名真实无误你的钱包还需要两道保险丝⏰ 时效保险Mandate 默认签发后 15 分钟过期见issue.ts中的DEFAULT_MANDATE_TTL_MS。过期即作废即使授权文件被窃取攻击者也无法隔夜使用。 金额保险签名时的maxAmount是包含运费的硬性消费上限。下单时如果实际总价含税、含运费超过了授权上限验证直接拒绝。哪怕商家结算时偷偷加价也过不了这道坎。这两道保险配合签名与 nonce构成了签名防伪造、nonce 防重放、时效防拖延、上限防超支的四重防线。一次Mandate只允许一次购买编排器的Fail-safe设计最后packages/checkout/src/orchestrator.ts把整个结账流程编排成三步顺序不可颠倒选择结算通道按商品能力匹配合适的结算方式纯函数不产生副作用通过 Mandate 硬门禁只有验证通过的授权才能进入下一步执行结算调用结算通道完成购买并把 Mandate 全文与凭证写入订单记录供日后审计这里有一个宁可保守不可冒进的设计哲学一份 Mandate 只对应一次购买尝试。如果验证通过后结算通道执行失败nonce 不会退还——你需要重新发起一次授权。这种失败安全fail-safe策略杜绝了一次授权被反复尝试直至成功的双花风险宁可在便利性上让步也绝不在资金安全上妥协。想亲手体验源码位置与快速上手如果你也想看看这份授权机制的真实模样可以按下面方式获取项目并阅读核心源码git clone https://gitcode.com/gh_mirrors/no/northcinder关键代码路径如下建议按顺序阅读可以完整串起签名购买授权的全链路packages/checkout/src/mandate/keystore.ts—— ed25519 密钥对生成与保管packages/checkout/src/mandate/issue.ts—— 授权签发与金额计算packages/checkout/src/mandate/canonical.ts—— 规范化签名载荷packages/checkout/src/mandate/verify.ts—— 验证硬门禁packages/checkout/src/mandate/nonce-ledger.ts—— 一次性 nonce 台账packages/checkout/src/orchestrator.ts—— 结账编排器docs/TRUST.md—— 项目的信任模型说明写在最后总结一下northcinder 的签名购买授权机制可以浓缩成一句话用 ed25519 证明是你签的用一次性 nonce 证明只用一次用 15 分钟有效期证明没有过期用金额上限证明没有超支。四者环环相扣、层层设防让购物Agent替你下单这件事第一次变得像银行卡签名一样——可追溯、可验证、不可抵赖。如果你是注重支付安全的网购用户或开发者这套设计值得仔细品味。【免费下载链接】northcinderBuyer-run, ad-neutral shopping-agent MCP software with deterministic ranking, signed purchase mandates, and a local audit trail.项目地址: https://gitcode.com/gh_mirrors/no/northcinder创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/4 5:35:18

基于SpringBoot的车库管理系统(源码+lw+部署文档+讲解等)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/10/1 13:31:03

Moukthar定位追踪指南:获取设备经纬度与海拔的3种方式

Moukthar定位追踪指南:获取设备经纬度与海拔的3种方式 【免费下载链接】moukthar Android remote administration tool 项目地址: https://gitcode.com/gh_mirrors/mo/moukthar Moukthar 是一款开源的 Android 远程管理工具(RAT)&…

2026/10/6 13:19:10

Docker部署Raneto:构建轻量级Markdown知识库实战

团队文档散落在聊天记录、本地文件夹和各式在线文档里,每次想找一份几个月前写过的方案都要翻半天。这种混乱让我下定决心建一套统一的知识库。研究了一圈之后,真正打动我的不是功能大而全的重型系统,而是 Raneto 这种足够轻、足够透明的方案…

2026/10/6 13:19:10

大数据面试逻辑题全解析:类型拆解、答题步骤与实战技巧

我一直觉得,大数据面试里的逻辑题,是整个面试环节里最“不讲武德”又最“见真章”的部分。说它不讲武德,是因为很多题表面上看跟大数据技术没半毛钱关系,不做准备的话,一上来容易懵;说它见真章,…

2026/10/6 13:19:10

MySQL表操作全攻略:从建表设计到改表索引与安全删除

MySQL 表的操作,说白了就是围绕一张表从生到死的所有动作:建表、看表结构、改表、加索引、清空、改名、复制,最后还要安全地删掉它。这件事我做了十多年,接手过的新老项目少说也有几十个,但每次帮别人排查慢查询或数据…

2026/10/6 13:19:10

Flutter开发Apple Watch应用实战:WCSession通信与WidgetKit表盘方案

先说结论: Flutter目前官方并不支持把watchOS作为编译目标,但这不代表你在Flutter项目里做不了WatchApp 。我这次从0到1走通了一条可行的路线:iOS主App用Flutter开发,WatchApp本体是watchOS原生工程,两者通过WCSessi…

2026/10/6 13:19:10

MySQL表操作全攻略:从建表设计到ALTER、DROP与锁表踩坑指南

写这张表的时候,我劝你多花十分钟。MySQL的表操作,可以说是整个数据库生涯里最基础也最“致命”的一环——说它基础,是因为你每天都要写CREATE TABLE、ALTER TABLE;说它致命,是因为我见过太多人因为建表时一个类型选错…

2026/10/6 13:14:10

Git + 云端仓库实战:安装配置、SSH免密与分支合并全攻略

1. 项目安全同步,为什么非 Git 不可 1.1 你还在用文件夹命名来"管理版本"吗 先问你一个扎心的问题:你的项目文件里,是不是还有这种东西—— 项目最终版_v5 、 项目最终版_真的不改了 、 项目最终版_最终最终_0321 &#xff…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑