安全な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つの層から成っています:

  1. HTML構造 - 入力フィールド、ライブフィードバックエリア、視覚的な進行バー。
  2. CSSスタイリング - カラーコードされたセグメントとアクセシビリティフレンドリーなインジケータ。
  3. [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を統合し、常にサーバー側のパスワードポリシーでメートルをペアリングすることを検討してください。 これらのベストプラクティスに従うことによって、ユーザーはスムーズなユーザーエクスペリエンスを維持しながら、より強力なパスワードを作成することを可能にします。