私は、ソルト、bcryptなどを使用したパスワードハッシュに精通しています。
しかし、攻撃者が10,000のすべての組み合わせを非常にすばやく試すことができるため、これは4桁のPINコードを格納するのに効果的ではないようです。私が見逃しているものはありますか、またはこれは通常どのように行われますか?
「リークされたデータベース」のシナリオが心配な場合(ユーザーごと、IPごと、サイトごとのレート制限とロックアウトによって軽減できるオンラインのクラッキングベクトルではなく)、ハッシングでは不十分です。 。
最も複雑なハッシュとソルティングのシーケンスを使用する場合でも、 bcrypt(pbkdf2(sha256(pin)、salt1)、salt2)アルゴリズムが使用されていることを確認でき(たとえば、ソースコード/ドキュメントのリークから)、ソルトを見つけることができる(通常は次の場所に保存されている)誰に対しても脆弱です同じDB /テーブル)-同じシリーズのハッシュを実行できます。たとえ1分ですべてを試すのに7日しかかかりません。したがって、基本的には無名のセキュリティに依存することになります。
この場合、パスワードハッシュをシークレットキーで暗号化する価値があります(これはソースコードとは別に保持でき、信頼できる「本番セキュリティ操作」ユーザーのみがアクセスでき、プリプロダクション環境で再利用されることはなく、定期的に変更されます。等。)。その秘密鍵は、PINコードを検証/更新するサーバー上に存在する必要がありますが、ユーザー/ピンデータベースとは別に(たとえば、暗号化された構成ファイルに)保持できます。つまり、 Little Bobby Tablesは、SQLインジェクションを介してT_USERS全体を手に取ったとき、またはシステム管理者のデスクから誰かがDBバックアップが含まれているDVDをつかんだときに、自動的にアクセスしません。
[通常、ハッシュを暗号化することはお勧めしません。安全なハッシュ、適切なソルト、強力なパスワード/フレーズを使用することをお勧めします。ハッシュを暗号化すると、誤った安心感を与える可能性があります。ただし、強力なパスワードを設定できない場合、他のオプションは多くありません。乞食は選択者になることはできません...]
PINとパスワードを組み合わせることもできますが、その場合はなぜPINを使用する必要がありますか?強力な英数字のパスワードが必要です。( PINは、スマートカードやトークンなどと組み合わせて使用されます。もちろん、全体的なセキュリティを強化できます。)
より大きな(6/8桁)PINを使用できます。数字のみを作ることは現実的ではありませんPINブルートフォースから保護する:1秒あたり1Bのハッシュでは、ブルートフォースの時間を1年を超えてプッシュするには16桁以上が必要です。しかし、数桁を追加するだけで、オンライン攻撃の検出とブロックが簡単になります-10Kの組み合わせだけでは、攻撃を実行不可能にするのに十分なほど「低速」しきい値を低く設定するのは困難です。残念ながら、長いPINを排除する物理的な制約(ハードウェアの選択)があります。
このタイプの攻撃を制限する2つの一般的なものは次のとおりです。
Bcryptなどのパスワードハッシュスキームは、次のコンテキストである程度のセキュリティを提供することを目的としています。攻撃者は、保存されているあらゆる情報を読み取ってパスワードを検証できます(たとえば、SQLインジェクション攻撃によってデータベースのダンプを取得します)。 4桁のPINの場合、エントロピーは非常に低く、このような状況では、大きな塩や聖書的な大きさの反復回数があっても、多くの抵抗を与えることはできません。したがって、4桁のPINを使用する場合、攻撃者は既にcannotがパスワード検証情報にアクセスしていると想定しています。この場合、PINを「そのまま」保存することができます。
攻撃者が推測ごとに通常の認証プロセスを実行する必要がある場合でも(つまり、online辞書攻撃:推測ごとに、攻撃者はユーザーまたはサーバーのいずれか、または両方と対話する必要があります)、10000可能PINは非常に低い数字です。したがって、適切なセキュリティは、任意の遅延を適用することによってのみ達成できます-極端なケースは、スマートカードが通常行うことです。他の人のアカウントを自由にロックできるようにしたくないので、これはネットワークサービスではデリケートです。
アプリケーションは何であるかは言いませんが、ピンの検証に専用のバックエンドサーバーを使用することを検討できます。
その後、フロントエンドWebサーバーよりもそのサーバーへのアクセスを制限できます。ピンチェックサーバーにレート制限などの制限を実装すると、フロントエンドサーバーが攻撃者に乗っ取られたとしても、ピンを力ずくで強制することができます。