Menu
CoddyTech

Schlüssel-Bytes vergleichen

Teil des Abschnitts Authentifizierung und Sicherheit der Node.js-Journey von Coddy. Lektion 5 von 24.

Zwei verschiedene Buffer-Objekte können dieselben Bytes enthalten. Ein Vergleich mit === prüft die Objektidentität, nicht, ob die Byte-Inhalte übereinstimmen. Verwende für geheime Schlüssel timingSafeEqual. Ein Byte-für-Byte-Vergleich, der beim ersten Unterschied abbricht, kann über seine Dauer Informationen preisgeben. Diese Funktion verwendet einen zeitkonstanten Byte-Vergleich; auch der restliche Login-Code muss Timing-Lecks vermeiden.

const same = token.length === savedToken.length
    && timingSafeEqual(token, savedToken);

Die Längenprüfung ist wichtig, weil timingSafeEqual bei unterschiedlichen Längen einen Fehler auslöst. Der &&-Ausdruck überspringt den Vergleich, wenn die Längen nicht übereinstimmen. Der bereitgestellte Startcode decodiert die übergebenen Hexadezimalzeichenfolgen für dich in Buffers. Konzentriere dich darauf, ein boolesches Ergebnis zurückzugeben. Bei einer vollständigen Passwortanmeldung wird zunächst der versuchte Schlüssel abgeleitet und anschließend dieser Vergleich durchgeführt.

challenge icon

Aufgabe

Einfach

Dies ist ein kleines Übungsprojekt. Das Setup ist vorgegeben; bearbeite nur exercise.js.

Gib {"same":true} zurück, wenn given und expected dieselben Bytes enthalten, andernfalls false. Eine POST-Anfrage mit {"given":"abcd","expected":"abcd"} an /result gibt true zurück. Wenn du given in abce oder ab änderst, wird false zurückgegeben, ohne einen Fehler auszulösen. Die Eingaben sind gültige Hexadezimalwerte.

Verwende das Ergebnis von timingSafeEqual, nachdem du die Byte-Längen geprüft hast. Kodierte Zeichenfolgen oder Buffer-Identitäten zu vergleichen, ist nicht die sichere Operation, die hier geübt wird.

Probier es selbst

import { timingSafeEqual } from 'node:crypto';
export function exercise(input) {
    const given = Buffer.from(input.given, 'hex');
    const expected = Buffer.from(input.expected, 'hex');
    return { same: given === expected };
}

Alle Lektionen in Authentifizierung und Sicherheit

Übe selbstständig: Express-Playground