
Email Verification API 中 nonce 一次性随机数如何防止重放攻击完整设计解析【免费下载链接】email-verificationverified autofill项目地址: https://gitcode.com/GitHub_Trending/em/email-verification在 Email Verification API邮件验证协议 EVP中nonce一次性随机数是防止重放攻击的核心安全机制。它让浏览器签发的邮件验证令牌EVT与某一次具体的表单提交强绑定从而让攻击者无法截获令牌后在别的场景二次使用。本文将面向新手讲清楚 nonce 是什么、为什么邮件验证离不开它以及它从生成到校验的完整防重放流程。什么是 noncenonce全称为Number used Only Once即只使用一次的数字。在 Email Verification API 里它是一个由服务端生成的、密码学强度的随机值写在表单的隐藏输入框上。规范原文对它的定义很直白当nonce属性出现在带有autocompleteemail-verification-token的input元素上时它包含一个服务端生成的、密码学强度的随机值。它的用途是把生成的 EVT 绑定到某一次具体的表单呈现上防止重放攻击。并且nonce的值必须对每一次页面渲染保持唯一。 定义来源index.bs一句话总结nonce 就是给这一次表单贴上的防伪唯一编号谁拿到令牌就得证明这个编号正是我发给你的那个。为什么邮件验证离不开 nonce要理解 nonce 的价值先看看传统邮件验证的痛点网站发一封带验证码或魔法链接的邮件用户切到邮箱、复制验证码、再回来粘贴。这个过程既慢又容易被钓鱼。Email Verification API 换了一种思路复用用户已经登录邮箱的会话由浏览器直接向邮箱服务商issuer请求一个加密签名的令牌EVT再自动填进网站表单提交用户无需切换上下文、无需复制粘贴。Step 网站 浏览器 邮箱服务商 | | | 1.1 登录状态 | |-- 已登录 ----| 2.1 EVT 请求 |---- nonce -----| 3.6 创建 KB | [绑定 nonce 源] 3.9 令牌呈现 |-- EVTKB ----| 4.1 令牌校验 [校验 EVTKB] 流程示意README.md但问题随之而来如果浏览器签发的令牌只是一个通用凭证攻击者截获它之后就能拿它去别的网站、或过一段时间再提交一次来冒充用户。这正是重放攻击。nonce 就是为了解决这个问题而存在的。它把令牌钉死在特定的网站来源 特定的那一次表单上。nonce 如何防重放三步绑定机制防重放的本质是把令牌和上下文绑成一对缺一不可。整个过程分三步第一步生成并下发唯一 nonce网站服务端为每次页面渲染动态生成一个不可预测的随机值放进隐藏输入框。规范推荐的写法是form action/signup methodpost input typeemail idemail nameemail autocompleteemail !-- EVP 隐藏输入框 -- input typehidden nameevt autocompleteemail-verification-token noncexyz123456789 button typesubmit注册/button /form 示例表单index.bs关键点nonce由服务端动态生成如 PHP 示例中的nonce?php generate_nonce() ?而不是前端写死的常量。 下发逻辑README.md第二步浏览器把 nonce 烧进令牌当用户选中邮箱并授权后浏览器向 issuer 请求到 EVT接着执行Key-Binding键绑定把nonce和验证方网站的源origin一起用浏览器临时生成的密钥对签名封进一个Key-Bound JWTKB-JWT。一旦签发浏览器就会把nonce和受众audience绑定到 EVT 上——既绑定了接收令牌的网站源也绑定了这个动态生成的 nonce。 绑定逻辑README.md这一步之后令牌就刻上了两个指纹给谁用origin哪一次表单nonce。哪怕原始 EVT 本身能被截获少了这两个绑定信息它在任何地方都过不了校验。第三步网站提交时逐一核验表单提交后浏览器把绑定的令牌填进隐藏框发给网站。网站服务端必须做三项校验任何一项失败即判定验证失败audience受众必须是自己的源nonce必须等于自己当初下发给这次表单的那个值exp过期时间未到期。规范对验证方的硬性要求验证方**必须MUST**核验audience匹配自己的源nonce匹配自己为这次表单呈现所生成的那个exp声明未过期。这能阻止攻击者截获 EVTKB 后把它重放到另一个站点或另一个上下文。 防重放安全要求index.bs 验证方处理模型index.bs为什么一次性 唯一是防重放的关键把上面三步串起来看重放攻击会被三道闸门逐一挡下攻击场景被哪道闸门拦下把令牌投给另一个网站源绑定不匹配origin/audience在同一个网站但用另一次表单重放nonce 不匹配截获令牌后过很久再提交exp已过期自己伪造一个 nonce 蒙混无法通过签名密钥校验其中 nonce 的两大设计属性是防重的基石一次性每个 nonce 只服务一次表单提交用过即作废天然杜绝反复用同一个。唯一性规范要求对每次页面渲染保持唯一从源头避免两次表单共用同一编号导致交叉命中。 唯一性约束index.bs开发者落地清单如果你要在自己的网站接入这套能力按下面清单执行即可服务端生成每次渲染表单时用密码学安全的随机源生成 nonce不要写死、不要复用。放进隐藏框把 nonce 加到autocompleteemail-verification-token的input typehidden上。服务端留存在会话中记录这次表单对应的 nonce提交时拿来比对。提交时三重校验校验 audience、nonce、exp 全部通过才算成功。用过即丢验证成功后立刻让该 nonce 失效防止后续重放。 新手调试步骤HOWTO.md常见误区❌前端写死 nonce必须由服务端动态生成否则攻击者可直接预测。❌一个 nonce 复用到多个表单规范要求每次渲染唯一复用会导致交叉命中。❌只验签名、不验 nonce签名只能证明issuer 签过不验 nonce 就无法定位到这一次重放照样得逞。❌忽略exp过期校验缺少时效性检查令牌可被长期持有反复尝试。小结在 Email Verification API 中nonce看似只是一个小小的随机数却是整条防重放链条的枢纽它由服务端为每次表单动态生成保证唯一且不可预测它被浏览器烧进 KB-JWT和网站源一起构成令牌的双重指纹提交时网站逐一核验audience、nonce、exp三道闸门层层拦截重放。理解了这个机制你就能明白邮件验证令牌之所以能自动填充却依然安全靠的不是它有多长而是nonce 把它牢牢锁在了这一次、这一个网站上。延伸阅读协议总览与三方模型index.bs浏览器处理模型自动填充与提交index.bs完整项目背景与动机README.md规范渲染后的可读版本index.html【免费下载链接】email-verificationverified autofill项目地址: https://gitcode.com/GitHub_Trending/em/email-verification创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考