py_webauthn(PyPI 上的 webauthn 包)基于 pyca/cryptography 生成注册和身份验证选项,并验证响应,支持所有证明格式。检查中向它输入的软件认证器注册数据和断言,与 SimpleWebAuthn、go-webauthn 和 WebAuthn4J 所用的完全相同,正因如此,它们之间的差异才清晰可见。
它的默认策略是这四个库中最宽松的。generate_registration_options() 完全不发送 authenticatorSelection 成员,于是浏览器退回到默认值:用户验证为 preferred,驻留密钥为 discouraged——即不可发现的通行密钥;而除非传入 require_user_verification=True,否则 verify_registration_response() 和 verify_authentication_response() 都接受了未设置 UV 标志的响应。因此,基于默认设置构建的登录流程,只需轻触安全密钥、无需输入 PIN 就能通过。应像示例那样,在生成选项和验证响应两端都显式设置策略。
断言签名必须是 ASN.1 DER:64 字节的原始 r‖s 签名报错 Could not verify authentication signature,这条消息并未提到编码;DER ⇄ 原始格式转换器可以显示测试客户端是否生成了错误的形式。high-S 的 DER 签名验证通过。默认提供 Ed25519(-8)、ES256(-7)和 RS256(-257);与 SimpleWebAuthn 14 不同,没有 ML-DSA 条目。
计数器检查很严格:5 之后出现 3 会报错 Response sign count of 3 was not greater than current count of 5,5 之后出现 0 也一样;而 0 之后仍为 0——同步通行密钥报告的正是这种情况——验证通过。每次登录成功后,都要保存返回的 new_sign_count。
用 WebAuthn 查看器解码浏览器的原始输出,并在通行密钥沙盒中放心试验。