web-dev-qa-db-ja.com

すでに保存されているパスワードハッシュのセキュリティを強化する

現在、1024バイトのPBKDF2と256バイトのユーザー固有のソルトおよび変数の反復を使用しています。ただし、アルゴリズムで使用されるラウンドを一年に一度、または一年に一律に増やすことができるようにしたいのですが。 BCryptもPBKDF2もそれを許可しないので...

それを忘れるか、SHA512/256を使用する独自のバージョンの再帰関数を実装する必要がありますか?ここでのアイデアは、パスワードを取り、ソルトを追加し、ハッシュをとり、ハッシュを取り、ソルトを追加し、ハッシュを取り、そのハッシュを取り、ソルトを追加し、ハッシュを繰り返します...悪心を繰り返します。

...または、ユーザーがログインするときに、システムに1年に1回、新しい回数のパスワードを再ハッシュさせるだけでよいですか?

8
NeroS

独自のアルゴリズムを構築することはneverが良い考えです。訓練を受けた暗号学者、すなわち、学界の暗いトンネルと科学会議の戦場で何年も努力した人々でさえ、他のすべてが失敗した場合にのみそのような独創性に訴えるでしょう。そしてそれでも、彼らは猛烈な同輩によって検証されるべきスキームを提案することを好む、確かにすぐに生産に配備されるべきではない。学術的なトレーニングのほとんどは、自分の分野の危険性に関する直感的な知識を習得することです。

アルゴリズムの設計は地雷原でのタップダンスのようなものです。

それにもかかわらず、ハッシュ値自体から始まる、格納されたハッシュの反復回数を単純に拡張することは不可能ですis通常の候補(PBKDF2、bcryptおよびscrypt)の既知の欠陥。それと共存する必要がある場合は、説明されているスキーム there を試すことができますが、セキュリティがincreasedであることを明示的に否定します。私のトレーニングとフィールドでの長年の経験により、私が提案する追加のハッシュラウンドは減少セキュリティではないと確信を持って述べることができます。

将来的には、物事は良くなります新しい パスワードハッシュアルゴリズムのオープンコンペティション のモデルを使用して、以前のAES、eSTREAM、SHA-3コンテスト。提出期限は2014年1月末です。暫定的なタイムラインによると、「優れたアルゴリズム」のポートフォリオは2015年半ばまでに取得されます。提出の要求には、次の望ましい機能が明示的に含まれています。

パスワードを知らなくても、既存のハッシュを別のコスト設定に変換する機能。

そのため、2年以上で問題の解決策を期待できます。わずか2年で、暗号化設計標準により、これは本当に高速です。

それまでの間は、ユーザーがログインするのを待つ通常の方法で、ユーザーがパスワードを繰り返しハッシュ化できるようにする必要があります。 1年以上ログインしていないほとんどのユーザーは、とにかくパスワードを忘れた可能性があります。

11
Thomas Pornin

古典的な解決策は、最後に書くものです-「ユーザーがログインしたときにパスワード[..]を再ハッシュする」。言い換えると:

  1. ユーザーはログインし、パスワードをプレーンテキストで提示します。
  2. システムは古いハッシュを使用してパスワードをハッシュし、保存されている値と比較します。
  3. それらが一致する場合、新しい強力なハッシュアルゴリズムを使用して平文パスワードをハッシュし、結果をデータベースに書き込みます。
  4. 特定の時間内にログインしないアカウントの場合は、サイトに再度アクセスするよう依頼する丁寧なメールを送信してください。そうしないと、アカウントが削除されます。

とはいえ、パスワードハッシュを使いすぎないように注意してください。パスワードハッシュの主な目的は、delay攻撃者によるパスワードの悪用after侵害の成功-エンドユーザーがパスワードを変更できるようにすることです。ある時点で、パスワードハッシュは、システム内の他のコンポーネントと比較して「十分」になりました。

明らかに、攻撃者がそもそもシステムに違反するのを防ぐことが最善です。そのため、安全なシステムを構築および維持するための継続的なGrindに十分なエネルギーを確保してください。 (継続的なコードセキュリティ監査、Webアプリケーションファイアウォールルールセットのメンテナンス、侵入検知システムの監視と構成、バックアップメディアのセキュリティ保護など)

5
Jesper M

私は同じ要件を持っていて、この方法でそれを解決しました:

  • PBKDF2と現在16である作業係数(つまり、2 ^ 16回の反復)を使用して、通常の方法でソルトとパスワードをハッシュします。ソルト、ハッシュ、作業係数などをデータベーステーブルの行として保存します。
  • 非同期的に(つまり、エンドユーザーに影響を与えずに)これをさらに3回行い、作業係数を毎回1増やします。したがって、このユーザーには4つのデータベース行があり、作業係数はそれぞれ16、17、18、19です。
  • 私は常にパスワードの検証に最も低い作業係数の行を使用しますが、2年ごとに最も低い作業係数の行を削除します。
1
HTTP 410