O py_webauthn (o pacote webauthn no PyPI) gera opções de registro e de autenticação e verifica as respostas, incluindo todos os formatos de atestado, sobre o pyca/cryptography. O teste alimentou a biblioteca com o mesmo registro e as mesmas asserções de um autenticador de software usados com o SimpleWebAuthn, o go-webauthn e o WebAuthn4J, e é isso que torna visíveis as diferenças entre eles.
Os padrões de política são os mais permissivos dos quatro. generate_registration_options() não envia nenhum membro authenticatorSelection, então os navegadores recorrem à verificação do usuário preferred e a chaves residentes discouraged — chaves de acesso que não são detectáveis —, e verify_registration_response() e verify_authentication_response() aceitaram respostas sem a flag UV, a menos que se passe require_user_verification=True. Por isso, um login construído sobre os padrões aceita um toque em uma chave de segurança sem PIN. Defina a política explicitamente nos dois lados, como faz o exemplo.
As assinaturas de asserção precisam estar em ASN.1 DER: uma assinatura r‖s bruta de 64 bytes falhou com Could not verify authentication signature, uma mensagem que não menciona a codificação; o conversor DER ⇄ bruto mostra se um cliente de teste produziu a forma errada. Uma assinatura DER high-S foi verificada. Ed25519 (-8), ES256 (-7) e RS256 (-257) são oferecidos por padrão; não há entrada para ML-DSA, ao contrário do SimpleWebAuthn 14.
Os contadores são estritos: Response sign count of 3 was not greater than current count of 5, e o mesmo para 0 depois de 5, enquanto 0 depois de 0 — o que as chaves de acesso sincronizadas informam — foi verificado. Armazene o new_sign_count retornado após cada login bem-sucedido.
Decodifique a saída bruta do navegador com o inspetor de WebAuthn e faça experimentos com segurança no ambiente de testes de chaves de acesso.