私はWebサイトを持っていて、ユーザーは選択したパスワードを使用して [〜#〜] rsa [〜#〜] 秘密鍵をJavaScriptクライアント側で暗号化します。サーバーに送信せずに強力なパスワードを使用していることを確認するにはどうすればよいですか?
パスワードの強度をチェックするJavaScriptライブラリである zxcvbn を使用できます。
または、 HaveIBeenPwned API は、パスワードをサーバーに送信せずにパスワードをチェックする興味深いアプローチを採用しています。
この方法では、パスワード全体を送信する必要はありませんが、クライアントはパスワードデータベース全体を取得する必要もありません。
パスフレーズの強さの質問に対する私の頼りになるのは NIST SP 800-63b: "Digital Identity Guidelines:Authentication and Lifecycle Management" です。これは米国政府の標準ですが、それはまた、私たちの残りの人々のための健全なガイダンスとしての役割も果たします。
5.1.1.2記憶された秘密検証
...
記憶されたシークレットを確立および変更する要求を処理するとき、検証者は、予想されるシークレットを、一般的に使用、期待、または侵害されていることがわかっている値を含むリストと比較する必要があります(SHALL)。たとえば、リストには以下が含まれる場合がありますが、これらに限定されません。
以前の違反コーパスから取得したパスワード。
辞書の単語。
反復または連続する文字(「aaaaaa」、「1234abcd」など)。
サービスの名前、ユーザー名、およびそれらの派生語などのコンテキスト固有の単語。
選択したシークレットがリストにある場合、CSPまたは検証者は、別のシークレットを選択する必要があることをサブスクライバーに通知し(SHALL)、拒否の理由を提供し(SHALL)、サブスクライバーに別の値を選択するように要求する必要があります(SHALL)。
検証者は、ユーザーが強力な記憶された秘密を選択するのを支援するために、パスワード強度メーター[メートル]などのガイダンスを加入者に提供する必要があります(SHOULD)。これは、上記のリストにある記憶された秘密の拒否に続いて特に重要です。これは、リストされた(そして非常に弱い)記憶された秘密の簡単な変更を阻止するためです[ブラックリスト]。
強度メーター(zxcvbnなど)を単にUIの補助として使用することを提案していますが、実際の適用はブラックリストに対して行われています。
私の経験では、これを実装する最良の方法は、クライアント側の(JavaScript)エントロピーベースの強度計を zxcvbn のように使用して、ユーザーが明らかに弱いパスフレーズを排除できるようにすることです。次に、[送信]をクリックしたときに、RESTを呼び出して、HaveIBeenPwnedなどのブラックリストデータベースを呼び出します。HaveIBeenPwnedAPIは、ユーザーの実際のパスワードが、@ Sjoerdはその答えをうまく説明しています。
パスワードエントロピーの測定は簡単な作業ではなく、基本的に実行することさえ不可能です。十分に努力すれば、あらゆるシステムや測定を回避することができます。ユーザーが本当に欲しければ、おそらく????
。
次のような適切なパスワードを選択する方法に関するユーザーガイドラインを提供することをお勧めします。
パスワードマネージャーを使用して長くランダムなパスワードを生成し、安全な場所に保管することをお勧めします。
パスワードマネージャーを使用できない場合は、Dicewareを使用して十分に適切なパスワードを生成することをお勧めします。
...などなど...
「パスワードの安全度」は明確に定義された指標ではありません。そして、そのようなチェッカーを実装するとき、ほとんどのライブラリがまだ古いおよび間違っている古いNISTガイドライン(特殊文字、数字、そのナンセンス)を実装していることに注意してください。
パスワード強度の最も強い指標は長さです。かなり長い最小長(2019年)を必要とすること(約12文字または重要なものでは16文字)は、最も強力な単一のチェックです。 Mikeは、詳細について、関連するNIST推奨をすでに含んでいます。
ライブラリを使用する場合は、古いライブラリではなくcurrent NISTガイドラインを実装するライブラリを選択してください。