[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$ffKmsMaAGLq-f32JGtAvmZUmk8K4kSqzH91X6-KXM7CY":3},{"item":4,"related":40},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":31,"sourceName":32,"sourceUrl":32,"status":33,"seoTitle":32,"seoDescription":32,"canonicalUrl":32,"isFeatured":34,"sno":35,"sortOrder":36,"publishedAt":37,"updatedAt":38,"createdAt":39},"84139b0b-2a60-4368-946d-3c05e0b88611","article","50 亿 Passkey：无密码登录最难的其实是找回账号","passkey-account-recovery-explained","Passkey 不只是用指纹登录，而是用与网站域名绑定的公钥凭证完成认证。本文拆解 WebAuthn 的挑战签名、防钓鱼原理、同步型与设备绑定型凭证，并解释为什么无密码之后，账号恢复反而成为产品安全的主战场。","你可能已经用指纹或面容登录过某个网站，却没有意识到：那一刻你并不是“把指纹交给了网站”，而是在让设备用一把私钥完成签名。Passkey 的核心变化，不是把密码换成了生物识别，而是把登录从“证明我知道一个秘密”改成了“证明我拥有一把与这个网站绑定的私钥”。\n\n![手机上的安全登录与生物识别示意图](https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1563013544-824ae1b704d3?w=1200)\n\n## Passkey 到底替代了什么\n\n传统密码登录至少有两份秘密：用户脑中的密码，以及服务器数据库里保存的密码验证材料。即使服务器不保存明文密码，攻击者仍可能通过钓鱼、撞库、键盘记录或社工拿到可用凭证。\n\nPasskey 使用非对称密码学。注册时，设备生成公钥和私钥：公钥可以交给网站保存，私钥留在设备或平台的安全凭证系统中。登录时，服务器发送一个一次性的随机挑战，设备让用户通过指纹、面容或 PIN 解锁私钥，再对挑战签名。服务器只需用公钥验证签名。\n\n这一步有两个容易混淆的细节。第一，指纹本身通常不会离开设备，网站拿到的是签名结果。第二，Passkey 不是一串可以复制到记事本里的字符，它是由凭证、网站域名、设备保护和用户验证共同组成的一次认证过程。\n\n## 一次登录经历了哪些步骤\n\n```mermaid\nflowchart TD\n    A[用户打开登录页] --> B[服务器生成随机挑战]\n    B --> C[浏览器检查网站域名]\n    C --> D[设备请求指纹面容或 PIN]\n    D --> E[私钥对挑战签名]\n    E --> F[服务器用公钥验证]\n    F --> G[建立登录会话]\n```\n\n网站在注册和登录时分别使用 WebAuthn 的创建凭证与获取凭证流程。服务器不能只检查“签名对不对”，还要检查挑战是否刚刚生成、凭证是否属于这个账号、RP ID 是否匹配，以及用户验证状态是否满足当前操作的风险要求。\n\n## 为什么它能抵抗很多钓鱼\n\nPasskey 的防钓鱼能力来自“域名绑定”，不是来自指纹这个动作本身。假设用户进入了 `paypaI.example` 这样的仿冒网站，浏览器会把当前域名交给 WebAuthn。由于这个域名与真正注册凭证时的 RP ID 不同，浏览器不会拿出原网站的 Passkey。\n\n这和密码管理器自动填充有相似效果，但边界更硬：密码可以被诱导输入，Passkey 的签名对象和域名会被协议层绑定。攻击者当然仍可诱导用户在假网站上注册一个新凭证，或者骗用户完成一笔已经被页面准备好的转账，因此 Passkey 主要解决的是身份凭证被窃取的问题，不会替产品解决授权和交易确认问题。\n\n## “无密码”之后，恢复账号变成了主战场\n\n密码丢了，可以走邮箱、短信或人工客服找回。Passkey 丢失时，问题更复杂：它可能只存在于旧手机，也可能通过平台账号同步到了新设备，还可能是公司安全密钥上的设备绑定凭证。\n\n常见的三种形态是：\n\n- **同步型 Passkey**：由平台的凭证管理器在用户设备间同步，换手机更方便，但账户恢复依赖平台账号和云端密钥保护。\n- **设备绑定型凭证**：私钥不离开硬件，适合高风险和企业场景，但设备损坏或遗失后必须有备用凭证。\n- **混合策略**：普通登录使用同步型凭证，提现、改安全设置等敏感操作要求额外的硬件密钥或重新验证。\n\n真正成熟的产品会在注册时就引导用户添加第二台设备、备用安全密钥或受控恢复联系人，而不是等用户被锁在门外后才显示一个“联系客服”。恢复流程本身也必须防止成为绕过 Passkey 的后门：如果只要回答几个容易猜的问题就能重置高价值账号，那么最强的登录凭证也会被最弱的找回流程抵消。\n\n## 开发时最容易漏掉的检查\n\n服务端至少要把下面几类数据分开管理：凭证 ID、公钥、用户验证要求、创建时间、最近使用时间和撤销状态。不要把“拥有一个凭证”直接等同于“拥有所有业务权限”。\n\n```js\n\u002F\u002F 伪代码：登录成功只代表身份通过\nconst user = await verifyWebAuthn(response, challengeStore.get(sessionId));\n\nif (!user) throw new Error('authentication failed');\n\n\u002F\u002F 转账、改绑设备等动作还要单独做授权和交易确认\nreturn createSession({ userId: user.id, assurance: user.verificationLevel });\n```\n\n还要记录异常设备、异常地理位置、凭证撤销和恢复事件。Passkey 减少了密码泄露面，却没有消除会话劫持、恶意浏览器扩展、客服社工和业务授权错误。\n\n## 记住这四句话\n\n第一，Passkey 的本质是公钥凭证，不是“把指纹上传到云端”。第二，域名绑定带来防钓鱼能力。第三，同步和恢复决定了普通用户能不能真正用起来。第四，登录认证成功之后，转账、改密和导出数据仍然需要独立的授权判断。\n\n进一步阅读：[W3C WebAuthn 规范](https:\u002F\u002Fwww.w3.org\u002FTR\u002Fwebauthn-3\u002F)、[FIDO Alliance 2026 年 Passkey 报告](https:\u002F\u002Ffidoalliance.org\u002Ffido-alliance-reports-accelerating-global-passkey-adoption-on-world-passkey-day-2026\u002F)。","\u002Fuploads\u002F2026-08-11\u002F325464b3-60d1-4813-b006-bb516a858cd3.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn\u002F","f39339b1-aaa6-4e86-b0c2-a6e6a21113b5",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27],{"id":24,"name":25,"slug":26},"4c2bbea6-eab7-40a8-8447-1de478ff7749","分析","analyse",{"id":28,"name":29,"slug":30},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug","资料来源",null,"published",false,65,0,"2026-08-10T00:00:00.000Z","2026-08-11T04:26:36.459Z","2026-08-11T02:35:40.146Z",[41,50,58],{"id":42,"type":6,"title":43,"slug":44,"summary":45,"coverUrl":46,"authorName":14,"sno":47,"publishedAt":48,"createdAt":49},"d6ff32b0-f499-453a-b1e3-c31a4a7a5b16","布隆过滤器：系统如何快速判断一个东西肯定不存在","bloom-filter-probabilistic-membership-explained","布隆过滤器用位数组和多个哈希函数，以极少内存快速筛掉肯定不存在的对象。本文讲清误报与漏报、误报率、删除难题，以及它在缓存、数据库和去重系统中的正确用法。","\u002Fuploads\u002F2026-08-06\u002F234915f6-2ef2-4820-8523-1a98544732f9.jpg",61,"2026-08-06T00:00:00.000Z","2026-08-06T05:38:25.381Z",{"id":51,"type":6,"title":52,"slug":53,"summary":54,"coverUrl":55,"authorName":14,"sno":56,"publishedAt":48,"createdAt":57},"23cd6a50-6716-4620-99f3-d5307511c8ee","CRDT：两个人同时改同一段文字，为什么不会互相覆盖","crdt-collaborative-editing-explained","CRDT 允许多个副本先本地修改，再通过可合并的数据结构最终收敛。本文用计数器和协同编辑讲清 CvRDT、CmRDT、并发插入、删除标记、元数据成本与业务语义冲突。","\u002Fuploads\u002F2026-08-06\u002F50641649-08d8-4cac-94f0-647eabe9fc5f.jpg",62,"2026-08-06T05:38:23.928Z",{"id":59,"type":6,"title":60,"slug":61,"summary":62,"coverUrl":63,"authorName":14,"sno":56,"publishedAt":48,"createdAt":64},"a04c10a4-3fe8-4537-81bd-354103c1078f","WebGPU：浏览器为什么能跑 3D、滤镜和部分 AI","webgpu-browser-gpu-computing-explained","WebGPU 让网页能更直接地使用 GPU 做渲染与通用计算。本文从 CPU 与 GPU 的分工讲起，拆解适配器、设备、缓冲区、WGSL 着色器和命令队列，并说明什么时候并行计算真的值得。","\u002Fuploads\u002F2026-08-06\u002F05f26f06-cda2-4ed3-b1f2-5f26c82c2a37.jpg","2026-08-06T05:38:22.834Z"]