一部の (特に銀行の) パスワード システムでは、ログインするためにパスワードから (指定された) 3 文字を入力する必要があります。
明らかに、ハッシュを計算するにはパスワード全体を知る必要があるため、通常のパスワードハッシュを使用してそのようなスキームを機能させる方法はありません。
そのようなシステムは、これを機能させるために一般的にサーバー側に何を保存しますか?
彼らはパスワードをプレーンテキストで保存しますか、それとも各文字の個別のハッシュ、または何を保存しますか?
ご指摘のとおり、パスワードの部分文字列のみを使用して認証が行われる場合、標準のパスワード ハッシュ スキームは機能しません。このようなシステムを実装するには、いくつかの方法があります。
パスワードを平文で保存します。
暗号化されたパスワードを保存し、復号化して確認します。
すべての (または十分な数の) 可能な部分文字列のハッシュを保存します。
k -out-of- nしきい値秘密共有を使用します。
最終的に、これらのスキームはすべて、データベースが侵害された場合のブルート フォース攻撃に対する脆弱性に悩まされます。これの根本的な理由は、典型的なパスワードの 3 文字の部分文字列 (実際には、特に強力なパスワードでさえも) にはあまりエントロピーがないため、クラックするのに多くの推測を必要としないからです。
これらのうちどれが最適ですか? それは言うのは難しいです。これらのスキームのいずれかを選択する必要がある場合、暗号化と検証を処理する別のサーバーまたは HSM を使用して、強力な対称暗号化 (AES など) を使用して暗号化されたストレージを選択するでしょう。そうすれば、少なくとも、フロントエンド サーバーを侵害する攻撃者は、データベースをコピーしてオフラインで攻撃することはできません (ただし、効果的なレート制限を実装していない場合、HSM にブルート フォース攻撃を仕掛けることはできますが)。 )。
ただし、パスワードの一部のみを認証に使用するという考え全体には大きな欠陥があると思います。特に限定されたいくつかの攻撃シナリオ (たとえば、は 1 つの認証イベントしか観測できず、同じチャレンジを受けるまで試行を続けることはできません) が、認証の成功に必要な情報量を減らすことによってセキュリティを根本的に弱めます。部分的なパスワード認証が対処するはずのセキュリティ上の懸念に対しては、TANなどのはるかに優れたソリューションがあります。