Table of Contents
安全なWebアプリケーションを構築するには、単なるセキュリティをバックエンドするだけでは、フロントエンドは、より安全な行動に向かってユーザーを指導する際に重要な役割を果たしています。 パスワード衛生を改善する最も効果的な方法の1つは、即時で実用的なフィードバックを与えるリアルタイムパスワード強度メーターです。 コンセプトは簡単ですが、プロダクション対応するメーターはエッジケースを処理し、明確なビジュアルキューを提供し、偽りの自信を回避する必要があります。 この包括的なガイドでは、JavaScriptパスワード強度をゼロから構築する方法を学びます。 注意、アクセスの練習、および最高のセキュリティ慣行、およびセキュリティ対策を十分に行わなければなりません。
パスワード強度メーターのマターがなぜパスワード強度メーターを測るのか
弱いパスワードは、アカウントの妥協の有意な原因のままです。 []NCSC]によると、多くのユーザーは「password123」のような予測可能なパターンに依存しています。 強度計は、エントロピーの計算を理解するためにそれらを必要としない、より複雑なパスワードに向かってユーザーを判断します。 GoogleとCarnegie Mellonの研究は、リアルタイムの強度フィードバックは、静的なルール上のパスワードセキュリティを大幅に向上できることを発見しました。
しかし、メートルは、その評価ロジックとしてのみ良いです。 設計されていないメーターは、強く(実際には共通しているとき)、または過度に厳しいルールを持つユーザーを開示する「Password1!」とラベル付けられるかもしれません。 最良のメートルは、ユーザビリティと複雑性のバランスをとり、複数の分析層を使用します。
パスワード強度を評価するためのコア基準
コードを書く前に、パスワード「strong」を作るものを定義します。長さや文字の多様性のような単純なルールは始まりますが、現代の脅威モデルはパターン、辞書の言葉、および一般的な置換を検討しています。このプロジェクトでは、次の要因に基づいて、スコーリングシステムを実装し、 ]]のガイドラインを厳密にフォローします。NIST SP 800-63B:
- 長さ[]:最大20文字までの報酬を増やすと、最小8文字。
- [Character var[]]: アッパーケース、小文字、数字、特殊文字。
- [] 繰り返し文字: "aaaa" のような順序のための罰則。
- [] 共通パターン[]: シンプルなキーボードウォーク(「qwerty」)、日付、または一般的な単語。
- Entropy estimation[: ビット強度は、可能な文字セットと長さに基づいて。
生産システムでは、パターンマッチングと周波数解析を使用する Dropbox から zxcvbn のようなライブラリを統合することを検討してください。この記事では、最初の 3 つの基準を覆うカスタムスコアラーを構築します。多くのユースケースでは、zxcvbn で拡張する方法を示します。
パスワード強度計のアーキテクチャ
メートルは3つの層から成っています:
- HTML構造 - 入力フィールド、ライブフィードバックエリア、視覚的な進行バー。
- CSSスタイリング - カラーコードされたセグメントとアクセシビリティフレンドリーなインジケータ。
- [JavaScript ロジック] – イベントの処理、スキャリング、およびパフォーマンスの解除によるUIの更新。
任意のフォームにドロップできるスタンドアローンコンポーネントとして構築します。フレームワークは必要ありません。 – バニラ JavaScript.
ステップ1:心のアクセシビリティを備えたHTML構造
画面リーダーが強度変化をアナウンスするので、セマンティックHTML5を[]で使用してください。 メーターには、数値スコア(多分隠された)と可視進行バーの両方が含まれるはずです。
<div class="password-field">
<label for="password">Choose a password:</label>
<input type="password" id="password" autocomplete="new-password" />
<div class="strength-meter" role="status" aria-live="polite">
<div class="strength-bar" id="strength-bar"></div>
<span class="strength-text" id="strength-text">Weak</span>
</div>
</div>
[ は、ユーザーが中断することなく動的変更が通知されるようにします。 [ は、ライブ領域としてマークします。
ステップ2:明確な視覚フィードバックのためのCSSスタイリング
線画勾配の進行バーを使用して色を変化させます。赤から黄色に緑色に変化します。微妙なアニメーションを含んだり、注意を引くことができます。シンプルでアクセスしやすいようにしてください。十分な色のコントラストを確保します。
.strength-meter {
margin-top: 0.5rem;
height: 1rem;
border-radius: 4px;
background-color: #e0e0e0;
}
.strength-bar {
height: 100%;
width: 0%;
border-radius: 4px;
transition: width 0.3s ease, background-color 0.3s ease;
}
.strength-text {
display: block;
margin-top: 4px;
font-weight: bold;
font-size: 0.9rem;
}
ステップ3:JavaScriptロジック - スコアリングアルゴリズム
スコア(0〜100)と対応するラベルを返す関数を実装します。 重度に報酬をあげ、キャラクターの多様性にポイントを与え、繰り返しのサブトラクトを行います。
function evaluateStrength(password) {
let score = 0;
// Length bonuses (exponential)
if (password.length >= 8) score += 20;
if (password.length >= 12) score += 20;
if (password.length >= 16) score += 20;
if (password.length >= 20) score += 20;
// Character variety
if (/[a-z]/.test(password)) score += 5;
if (/[A-Z]/.test(password)) score += 5;
if (/[0-9]/.test(password)) score += 5;
if (/[^a-zA-Z0-9]/.test(password)) score += 10;
// Penalty for repeated characters (3+ consecutive same)
const repeats = password.match(/(.)\1{2,}/g);
if (repeats) {
const penalty = repeats.reduce((acc, seq) => acc + seq.length, 0) * 2;
score = Math.max(0, score - penalty);
}
// Clamp score to 0–100
return Math.min(100, Math.max(0, score));
}
function getStrengthLabel(score) {
if (score < 30) return 'Weak';
if (score < 60) return 'Moderate';
if (score < 85) return 'Strong';
return 'Very Strong';
}
このアルゴリズムは、長いパスワードでもミリ秒単位で軽量で実行されます。 製造アプリでは、非常に長い入力(まれに)の主スレッドをブロックすることを避けるためにタイムアウトベースの評価を追加することを検討してください。
ステップ4:入力イベントのデバッグ
特にzxcvbnのような重いライブラリと統合する場合、すべてのキーストロークの評価をフィリングすることができます。 ユーザーが300msのタイピングを停止するまで、デバウンス関数を使用して評価を遅延させます。
const input = document.getElementById('password');
const strengthBar = document.getElementById('strength-bar');
const strengthText = document.getElementById('strength-text');
let debounceTimer;
input.addEventListener('input', function() {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
const score = evaluateStrength(this.value);
updateUI(score);
}, 300);
});
function updateUI(score) {
const label = getStrengthLabel(score);
strengthBar.style.width = score + '%';
strengthBar.style.backgroundColor = getColor(score);
strengthText.textContent = label;
}
function getColor(score) {
if (score < 30) return '#e53935'; // red
if (score < 60) return '#fb8c00'; // orange
if (score < 85) return '#43a047'; // green
return '#1b5e20'; // dark green
}
ステップ5:高度な強化 - zxcvbnを統合
カスタム評価者は、一般的なパスワードパターンを欠落させます。 Dropboxのzxcvbnライブラリは、周波数辞書とパターンマッチングを使用して、より正確なスコアを生成します。 それを統合するには、CDNを介してライブラリをロードし、同じUIを維持しながら評価ロジックを置き換えます。
<script src="https://cdnjs.cloudflare.com/ajax/libs/zxcvbn/4.4.2/zxcvbn.js"></script>
それから、非バウンスコールバックで:
const result = zxcvbn(this.value);
const score = result.score; // 0-4
updateUI(score * 25); // map to 0-100
から、より強力なパスワードのユーザーを誘導する提案を表示することもできます。
ステップ6:フォームの統合とフィードバック
メートルを止めないでください。フォームの送信ハンドラにリンクします。パスワードのスコアが低すぎると、投稿を防ぎ、メッセージを表示できます。また、「パスワードを表示する」をトグルを実行して、ユーザーは入力を確認することができます。これにより、不満が軽減されます。
const showToggle = document.getElementById('show-password');
showToggle.addEventListener('change', function() {
input.type = this.checked ? 'text' : 'password';
});
document.querySelector('form').addEventListener('submit', function(e) {
const score = evaluateStrength(input.value);
if (score < 30) {
e.preventDefault();
alert('Password is too weak. Please choose a stronger one.');
}
});
セキュリティの考慮事項
クライアント側の強度計は、UX に有用ですが、セキュリティメカニズムとして扱うことはありません。常にサーバー側の強力なパスワードポリシーを強制します。 決して、テストのために plaintext パスワードをサーバーに送信しないでください。 これにより、トランジットでそれを露出します。 HTTPS とハッシュ (bcrypt、argon2) を使用して、ストレージ。 メーターは、パスワードをログまたは保存しないでください。
また、メーターのフィードバックは、UI出力を観察できると、パスワード領域を狭くするために、攻撃者によって使用できることを考慮する。 高セキュリティ環境では、正確なスコアを明らかにすることなく、強度のフィードバックを制限したり、不適切な見積もりを使用することをお勧めします。
パスワード強度計のテスト
一般的なテストケースを使用して、スコーリング機能のユニットテストを書く:
- "password" → 弱い (スコア< 30)
- 「P@ssw0rd123!」 → 強力(スコア> 60)
- ワクワク
- 「コルクト・ホース・バッターリー・ステープル」 → 非常に強い
- 「11111111」→ 弱い(愛称ペナルティ)
キーボードナビゲーションとスクリーンリーダーを使用してアクセシビリティをテストします。 領域は、短い一時停止後に強度の変更をアナウンスする必要があります。
パフォーマンス最適化
zxcvbn を使用する場合、動的インポートまたはデフェア属性で非同期にロードすることを検討してください。非常に長いパスワード(100 + 文字)の場合、最初の 100 文字に対する評価を制限し、減速を回避します。デブーンは重要なままです。遅延を 250–400ms に設定します。モバイルデバイスでは、応答性200ms までのデバウンス時間を減らすことを検討します。
カスタマイズとテザミング
開発者が設定オブジェクトを介して色、しきい値、およびスキャリングをオーバーライドできるようにします。 コールバックインターフェイスを提供しているので、メーターはパスワードジェネレータ、一般的なパスワードブラックリスト、またはエントロピー計算機と統合できます。
function createStrengthMeter(inputEl, options = {}) {
const config = {
minLength: options.minLength || 8,
colors: options.colors || ['#e53935', '#fb8c00', '#43a047', '#1b5e20'],
thresholds: options.thresholds || [30, 60, 85]
};
// ... rest of the plugin logic
}
コンテンツ
JavaScriptパスワード強度計の構築は、摩擦を加えることなく、ユーザーのセキュリティを向上させるための実用的な方法です。この記事の例では、スコーリングアルゴリズム、デバウンスイベント処理、アクセス可能なHTML、およびビジュアルフィードバックを提供します。 生産アプリケーションでは、高度なパターン検出のためにzxcvbnを統合し、常にサーバー側のパスワードポリシーでメートルをペアリングすることを検討してください。 これらのベストプラクティスに従うことによって、ユーザーはスムーズなユーザーエクスペリエンスを維持しながら、より強力なパスワードを作成することを可能にします。