Güç
@virastack/password/strength ile NIST tarzı parola politikası: uzunluk, yaygın parolalar, tekrarlar ve kişisel bilgi.
definePolicy()
Politikayı "use client" içermeyen ortak bir dosyada bir kez tanımlayın. Form ve sunucu aynı nesneyi import eder.
// lib/password-policy.ts
// Shared by the form and the server, so no "use client".
import { definePolicy } from "@virastack/password/strength";
export const policy = definePolicy({ preset: "nist", blocklist: ["virastack"] });Şablonlar
| Şablon | Uzunluk | Bileşim |
|---|---|---|
nist (varsayılan) | 15–64 | Yok. NIST SP 800-63B-4'e göre: uzunluk ve yasak liste, bileşim kuralı yok |
legacy | 8–64 | Küçük harf, büyük harf, rakam ve sembol |
Şablonun her değeri değiştirilebilir:
definePolicy({ preset: "nist", minLength: 8 }) // ikinci faktörle (MFA)
definePolicy({ preset: "legacy", require: { symbol: false } })
definePolicy({ blocklist: ["acme", "acme pay"] }) // ürün adınız, herhangi bir yerde
definePolicy({ minTokenLength: 4 }) // kısa adlarda daha az yanlış pozitif
definePolicy({ blockCommon: false, blockRepetitive: false })Çakışan kurallar (örneğin maxLength'ten büyük minLength) politika tanımlanırken hata fırlatır.
Sonuç
import { evaluate } from "@virastack/password/strength"
import { policy } from "@/lib/password-policy"
evaluate("correct horse battery staple", policy)
// {
// score: 0, // 0–1 politikayı geçmez, 2–4 geçer
// level: "weak", // "weak" | "fair" | "good" | "strong"
// length: 28, // NFKC sonrası karakter (code point)
// valid: false,
// checks: { minLength: true, maxLength: true, notCommon: false, ... },
// issues: ["password.common"],
// }| Anahtar | Ne zaman |
|---|---|
password.tooShort / tooLong | minLength–maxLength dışında |
password.noLowercase / noUppercase / noDigit / noSymbol | Gerekli bir karakter sınıfı eksik (legacy) |
password.common | Yaygın bir parola; etrafında rakam, sembol veya leetspeak olsa bile |
password.blocked | Politikanın blocklist'indeki bir kelimeyi içerir |
password.repetitive | Tekrar veya dizi: aaaa…, abcabc…, 12345…, qwerty… |
password.containsPersonalInfo | forbidden değerlerinden birini içerir |
Skor, uzunluk ve karakter çeşitliliğinden çıkan bir sezgiseldir; kırılma süresi tahmini değildir. Onun için karşılaştırmaya bakın.
Karmaşık bir 14 karakterlik parola neden zayıf? Skor evrensel bir kurala değil, politikaya göre hesaplanır. Varsayılan nist şablonu 15 karakter ister; daha kısa parolalar ne kadar karışık olursa olsun politikayı geçemez ve 0–1 alır. 15 karakterden sonra skor uzunluk ve çeşitlilikle artar. Daha kısa parola mı gerekiyor? minLength: 8 (NIST ikinci faktörle buna izin verir) veya legacy şablonunu kullanın.
Hook içinde
policy verin; strength, issues ve strengthProps alanlarını okuyun. Hook motoru import etmez; motor politikayla gelir, yani yalnızca toggle kullanan sayfa onu indirmez.
15 characters or more
forbidden
Paket kullanıcınızı bilmez; değerleri siz verirsiniz. Eşleştirme büyük/küçük harfi, aksanı ve basit leetspeak'i yok sayar.
evaluate(password, policy, { forbidden: [email, name, username] })
// "hello@virastack.com" → "hello" (alan adı yok sayılır)
// "Vira Stack" → "vira stack", "vira", "stack"minTokenLength'ten (varsayılan 3) kısa parçalar yok sayılır. Kısa parçalar yanlış pozitife yol açar: dev@virastack.com için dev parçası devoted-garden-path parolasını reddeder. Sizin için önemliyse 4'e çıkarın.
Try vira-garden-path
Unicode
- Parola NFKC ile normalleştirilir; farklı klavyelerde yazılan aynı metin aynı sonucu verir.
- Uzunluk code point sayar: bir emoji veya Türkçe harf bir kez sayılır.
- Sıfır genişlikli karakterler uzunluğa sayılmaz.
maxLength'te hiçbir şey kesilmez; uzun parolapassword.tooLongalır.
Yapıştırma
Parola alanlarına yapıştırmayı engellemeyin. Parola yöneticileri buna dayanır ve NIST izin verilmesini önerir. Hook yapıştırmayı asla engellemez.
