Code
const b64 = (b) => btoa(String.fromCharCode(...new Uint8Array(b)));
const unb64 = (s) => Uint8Array.from(atob(s), (c) => c.charCodeAt(0));
const derive = async (pw, salt, iterations) => {
const key = await crypto.subtle.importKey('raw', new TextEncoder().encode(pw), 'PBKDF2', false, ['deriveBits']);
return crypto.subtle.deriveBits({ name: 'PBKDF2', hash: 'SHA-256', salt, iterations }, key, 256);
};
// Format: iter$salt$hash
const hashPassword = async (pw, iter = 600_000) => {
const salt = crypto.getRandomValues(new Uint8Array(16));
return `${iter}$${b64(salt)}$${b64(await derive(pw, salt, iter))}`;
};
const verifyPassword = async (pw, stored) => {
const [iter, salt, hash] = stored.split('$');
const a = new Uint8Array(await derive(pw, unb64(salt), +iter));
const b = unb64(hash);
// zeitkonstanter Vergleich
return a.length === b.length && a.reduce((d, x, i) => d | (x ^ b[i]), 0) === 0;
};
Verwandte Snippets // Kategorie: Krypto & Passwörter
Häufige Fragen
Darf ich dieses Snippet kopieren und produktiv einsetzen?
Ja — alle Code-Beispiele auf programmierung.net dürfen frei kopiert und angepasst werden. Prüfe vor dem Produktiv-Einsatz immer Edge-Cases (leere Eingaben, Encoding, Fehlerbehandlung) und die Lizenzvorgaben eingebundener Bibliotheken.
Welche JavaScript-Version wird vorausgesetzt?
Snippets zielen auf aktuelle, stabile JavaScript-Versionen. Versionsabhängige Features werden im Code oder in der Beschreibung ausgewiesen.
Wo finde ich weitere JavaScript-Snippets?
In der Seitenleiste siehst du alle Snippets dieser Sprache. Oder gehe zur JavaScript-Übersicht.