账号认证的基础已经烂了——不只是“不方便”三个字能概括的。密码就是一对分享的秘密:你把它递给服务器,攻击面立刻翻倍。全球已有超过50亿个passkeys在使用,谷歌那边传出的数字是,对比传统密码,账号被盗的概率砍掉了99.9%。这份指南会拆解passkeys背后真正的加密原理,怎么用TypeScript落地,以及上生产环境之前该躲的坑。
密码的问题不在用户懒。秘密需要两头存,这个结构本身就是漏勺。根据Verizon发布的2025年数据泄露调查报告,22%的泄露事件起点就是偷来的凭据,web应用攻击里88%走的这条路。去年光是信息窃取木马就收割了5.48亿个密码。上了双重认证也补不住这个窟窿:短信验证码能靠SIM卡克隆截走,基于时间的一次性密码令牌同样能被实时钓鱼——代理攻击者可以在有效期内重放那些六位数。
![]()
passkeys是什么东西?它就是基于公钥密码体系的一套凭证,标准化在WebAuthn规范和FIDO2框架里。注册的时候,你的设备生成一对公私钥。私钥锁死在硬件安全区域里——可能是设备内置的安全隔区、独立安全芯片,或者外接的硬件密钥。服务器端只拿到公钥。到了登录那一步,服务器扔出一个随机挑战值,你刷脸或者输PIN解锁私钥签名,服务器验签。整个过程里,秘密不会在网络上传出去哪怕一次。凭证填充、服务器被端掉导致密码大面积曝光、钓鱼攻击——这几样会被直接掐断,因为每一个passkey在加密上就绑定了一个特定的源头域名。
值得你花十分钟搞懂的加密细节:标准算法是ES256,也就是P-256曲线上跑的ECDSA搭配SHA-256。每一个凭证绑死一个依赖方ID——放到实际场景里就是你们应用的域名。在攻击者伪造的域名上,passkey根本签不出有效签名,因为源头信息已经嵌在一条叫clientDataJSON的数据里,验证器在动私钥之前就会先核验这个来源。注册流程大致是这么个顺序:服务器生成一次性挑战值,客户端调用系统接口完成凭证创建,验证器用新生成的私钥签署一条证明,服务器最后验证并存下公钥和凭证ID。认证的时候反过来走,只需要调另一个调用。
别从底层裸写WebAuthn。光是CBOR解码和签名验证这两个环节,配错一次就够你喝一壶。找到SimpleWebAuthn这个库就够了——在npm上每周下载量超过80万次,对于TypeScript和Node.js环境来说已经是老熟人了。它会用清爽的API把加密里的脏活累活包掉。装包就两句命令,把server和browser端的分开装。服务端这边怎么用Express配合生成注册选项,然后验签,官方给的路径足够清晰。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.