Golang 新提案,拟在标准库新增 crypto/passkey​ 包

关于Passkey 的介绍参见 《Passkey 无密码登录》。

前 Go 密码学负责人 Filippo Valsorda 提交 golang/go#80663 提案,拟在标准库新增 crypto/passkey 包,用“无状态、无回调、无接口”的极简服务端 API,把中小型网站接入 Passkey(WebAuthn 可发现凭据)的门槛降到最低。

核心设计有三块。一是 passkey-record 规范:把认证器数据、transports 等编码成类似 PHC 密码哈希的单行不透明字符串(如 $webauthn$v=1$...),存库时当黑盒文本即可,支持跨语言、跨库迁移。 二是 存储模型简化:数据库只需 user_id + record 两列、按 user_id 建索引,不对 credential_id 建唯一索引——凭据永远先按用户查再逐条比对,从根上规避跨账号主键碰撞攻击。 三是 流式无状态工作流RelyingParty 是纯配置对象,注册走 NewRegistration→前端 navigator.credentials.createRegister 存串;登录走 NewLoginParseResponseUnauthenticatedUserID(验签前不可信,仅用于查记录)→Login

关键安全取舍:弃用回调(吸取 GO-2024-3321 教训,避免未验数据流入应用判断)、强制单 Origin 配置(多源需建多个 RP 实例,防跨站断言重放)、User ID 用 crypto/rand.Text() 生成随机不透明串、不校验 attestation 与签名计数器,专为消费级 95% 场景减负。

提案仍处评审期,未进正式版本,但信号明确:Passkey 接入正从“懂协议”降级为“按 user_id 存一个字符串”。

如果你有魔法,你可以看到一个评论框~