Sızmış parolalar
İsteğe bağlı Have I Been Pwned kontrolü, k-anonymity ile: @virastack/password/pwned.
Kullanım
Siz çağırmadıkça kapalıdır. Ücretsiz Pwned Passwords range API'sini kullanır; anahtar ve bağımlılık gerekmez.
// app/signup/pwned-action.ts
"use server";
import { checkPwned, type PwnedResult } from "@virastack/password/pwned";
// From the server, Have I Been Pwned never sees the user's IP.
// Only the first 5 characters of the SHA-1 hash are sent.
export async function checkPassword(password: string): Promise<PwnedResult> {
return checkPwned(password, { timeout: 3000 });
}checkPwned(password, {
signal, // AbortSignal
timeout: 3000, // ms, varsayılan 5000
fetch, // özel fetch (test, proxy)
})Sonuç
| Sonuç | Anlamı |
|---|---|
{ status: "pwned", count } | Sızıntılarda count kez görülmüş |
{ status: "safe" } | Listede yok |
{ status: "unknown", reason } | empty, unsupported (crypto.subtle veya fetch yok), network, timeout, aborted, rate-limited, http |
Hiç hata fırlatmaz. unknown durumunda kullanıcının devam etmesine izin verin (fail open).
Gizlilik ve sınırlar
- Parolanın SHA-1 özetinin yalnızca ilk 5 karakteri gönderilir; parola ve tam özet asla çıkmaz. Yanıtlar dolgu (padding) içerir.
- Sunucudan çağırın. Tarayıcıdan çağrılırsa Have I Been Pwned kullanıcının IP'sini görür.
crypto.subtleyalnızca HTTPS ve localhost'ta vardır; aksi halde sonuçunknownolur.- Her tuş vuruşunda çağırmayın; gönderimde kontrol edin.
