py_webauthn (das Paket webauthn auf PyPI) erzeugt die Optionen für Registrierung und Authentifizierung und prüft die Antworten einschließlich aller Attestierungsformate, aufgebaut auf pyca/cryptography. Die Prüfung übergab der Bibliothek dieselbe Registrierung und dieselben Assertions eines Software-Authenticators wie bei SimpleWebAuthn, go-webauthn und WebAuthn4J – genau das macht die Unterschiede zwischen ihnen sichtbar.
Die Standardwerte der Richtlinie sind die lockersten der vier Bibliotheken. generate_registration_options() sendet überhaupt kein Element authenticatorSelection, sodass Browser auf Benutzerverifizierung preferred und Resident Keys discouraged zurückfallen – also auf Passkeys, die nicht auffindbar sind –, und verify_registration_response() und verify_authentication_response() akzeptierten Antworten mit nicht gesetztem UV-Flag, sofern nicht require_user_verification=True übergeben wird. Eine Anmeldung, die auf den Standardeinstellungen aufbaut, akzeptiert daher ein Antippen des Sicherheitsschlüssels ohne PIN. Lege die Richtlinie auf beiden Seiten explizit fest, wie es das Beispiel tut.
Assertion-Signaturen müssen ASN.1-DER sein: Eine rohe r‖s-Signatur mit 64 Byte scheiterte mit Could not verify authentication signature, einer Meldung, die die Kodierung nicht erwähnt; der Konverter DER ⇄ Raw zeigt, ob ein Test-Client die falsche Form erzeugt hat. Eine DER-Signatur mit High-S bestand die Prüfung. Standardmäßig werden Ed25519 (-8), ES256 (-7) und RS256 (-257) angeboten; anders als bei SimpleWebAuthn 14 gibt es keinen Eintrag für ML-DSA.
Die Zähler sind streng: Response sign count of 3 was not greater than current count of 5, ebenso bei 0 nach 5, während 0 nach 0 – das, was synchronisierte Passkeys melden – die Prüfung bestand. Speichere nach jeder erfolgreichen Anmeldung den zurückgegebenen Wert new_sign_count.
Dekodiere rohe Browserausgaben mit dem WebAuthn-Inspektor und experimentiere gefahrlos in der Passkey-Sandbox.