Signatur
Beschreibung
Die Methode getPublicKeyAlgorithm() der Schnittstelle AuthenticatorAttestationResponse liefert eine Ganzzahl. Sie steht für den COSE-Algorithmus-Identifier (IANA-Registry „COSE Algorithms“), mit dem der Authenticator das Schlüsselpaar der neuen Anmeldeinformation (Passkey) erzeugt hat. Typische Werte sind -7 (ES256, ECDSA mit P-256 und SHA-256), -8 (EdDSA) und -257 (RS256, RSASSA-PKCS1-v1_5 mit SHA-256).
Die Methode ist nur bei der Registrierung verfügbar, also auf dem response-Objekt des PublicKeyCredential, das navigator.credentials.create() zurückgibt. Zusammen mit getPublicKey() kann eine Webanwendung den öffentlichen Schlüssel und seinen Algorithmus direkt auslesen, ohne das CBOR-kodierte attestationObject selbst zu parsen.
In der Praxis schickt man den Algorithmus-Wert zusammen mit dem Schlüssel (SPKI/DER) an den Server und speichert ihn dort. Der Server braucht ihn später, um Signaturen bei der Anmeldung (navigator.credentials.get()) zu prüfen. Welcher Algorithmus gewählt wird, legt die Relying Party über die Reihenfolge in pubKeyCredParams fest. Der Authenticator nimmt den ersten davon, den er unterstützt.
Rückgabewert
-7 (ES256), -8 (EdDSA) oder -257 (RS256). Der Wert entspricht einem der in pubKeyCredParams angefragten Algorithmen.Beispiele
Algorithmus nach der Passkey-Registrierung auslesen
const credential = await navigator.credentials.create({
publicKey: {
challenge: crypto.getRandomValues(new Uint8Array(32)),
rp: { name: 'Beispiel GmbH' },
user: {
id: new TextEncoder().encode('user-42'),
name: 'max@example.com',
displayName: 'Max Mustermann'
},
pubKeyCredParams: [
{ type: 'public-key', alg: -7 }, // ES256
{ type: 'public-key', alg: -257 } // RS256
]
}
});
const alg = credential.response.getPublicKeyAlgorithm();
console.log('COSE-Algorithmus:', alg);
Algorithmus-ID in lesbaren Namen übersetzen
const COSE_ALGORITHMS = {
[-7]: 'ES256 (ECDSA P-256 / SHA-256)',
[-8]: 'EdDSA (Ed25519)',
[-35]: 'ES384 (ECDSA P-384 / SHA-384)',
[-257]: 'RS256 (RSASSA-PKCS1-v1_5 / SHA-256)'
};
const describeAlgorithm = (response) => {
const alg = response.getPublicKeyAlgorithm();
return COSE_ALGORITHMS[alg] ?? `Unbekannt (${alg})`;
};
// credential stammt aus navigator.credentials.create()
console.log(describeAlgorithm(credential.response));
Schlüssel und Algorithmus an den Server senden
const toBase64Url = (buffer) =>
btoa(String.fromCharCode(...new Uint8Array(buffer)))
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
const registerCredential = async (credential) => {
const { response } = credential;
const payload = {
id: credential.id,
publicKey: toBase64Url(response.getPublicKey()), // SPKI (DER)
publicKeyAlgorithm: response.getPublicKeyAlgorithm(), // z. B. -7
clientDataJSON: toBase64Url(response.clientDataJSON),
attestationObject: toBase64Url(response.attestationObject)
};
const res = await fetch('/api/webauthn/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
return res.ok;
};
// Wichtig · Fallstricke
- Nur bei der Registrierung: Die Methode gibt es nur auf
AuthenticatorAttestationResponse(Ergebnis voncreate()), nicht aufAuthenticatorAssertionResponse(Ergebnis vonget()). - Nicht blind vertrauen: Der Wert stammt vom Client. Für die Sicherheit muss der Server das
attestationObjectselbst prüfen und kontrollieren, ob der Algorithmus zu den erlaubtenpubKeyCredParamsgehört. - Negative Zahlen: COSE-IDs sind oft negativ. Beim Speichern einen vorzeichenbehafteten Integer-Typ verwenden.
- Zusammenspiel mit
getPublicKey(): Ist der Algorithmus dem Browser unbekannt (etwa bei manchen EdDSA-Varianten in älteren Versionen), kanngetPublicKey()nullliefern.getPublicKeyAlgorithm()gibt die ID trotzdem zurück. In diesem Fall muss der Schlüssel aus demattestationObjectgelesen werden. - Kompatibilität: Die Methode kam erst mit WebAuthn Level 2. Ältere Browser kennen sie nicht. Vor dem Aufruf mit
typeof response.getPublicKeyAlgorithm === 'function'prüfen. WebAuthn funktioniert nur in sicheren Kontexten (HTTPS oder localhost). - Für eine breite Kompatibilität in
pubKeyCredParamsimmer mindestens-7(ES256) und-257(RS256) anbieten.