Start · Sprachen · JavaScript · Referenz · AuthenticatorAttestationResponse.getPublicKeyAlgorithm()

AuthenticatorAttestationResponse.getPublicKeyAlgorithm()

Methode

Gibt den COSE-Algorithmus-Identifier (z. B. <code>-7</code> für ES256) des öffentlichen Schlüssels einer neu erzeugten WebAuthn-Anmeldeinformation zurück.

seit JavaScript WebAuthn Level 2 – Chrome/Edge 85+, Firefox 119+, Kategorie: webapi

Signatur

AuthenticatorAttestationResponse.prototype.getPublicKeyAlgorithm()

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

Typ
number
Beschreibung
Ganzzahliger COSE-Algorithmus-Identifier, z. B. -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);
COSE-Algorithmus: -7

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));
ES256 (ECDSA P-256 / SHA-256)

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 von create()), nicht auf AuthenticatorAssertionResponse (Ergebnis von get()).
  • Nicht blind vertrauen: Der Wert stammt vom Client. Für die Sicherheit muss der Server das attestationObject selbst prüfen und kontrollieren, ob der Algorithmus zu den erlaubten pubKeyCredParams gehö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), kann getPublicKey() null liefern. getPublicKeyAlgorithm() gibt die ID trotzdem zurück. In diesem Fall muss der Schlüssel aus dem attestationObject gelesen 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 pubKeyCredParams immer mindestens -7 (ES256) und -257 (RS256) anbieten.