7

複数のアルゴリズムを使用すると、パスワードがより安全になりますか?(以下?)

明確にするために、私はこのようなことをすることについて話しているのではありません:

key = Hash(Hash(salt + password))

私は2つの別々のアルゴリズムを使用し、両方を一致させることについて話しています:

key1 = Hash1(user_salt1 + password)
key2 = Hash2(user_salt2 + password)

次に、認証時に両方を一致させる必要があります。これは衝突の一致を排除する方法として提案されているのを見てきましたが、「最も弱いリンク」シナリオを作成したり、ユーザーデータベースを解読しやすくする情報を提供したりするなど、意図しない結果について疑問に思っています。この方法では、より多くのデータが提供されるためです。単一のキーが行います。たとえば、情報をハッシュで組み合わせて、より簡単に見つけることができます。また、衝突が本当に排除された場合、理論的には、一致するパスワードだけでなく、実際のパスワードを総当たり攻撃する可能性があります。実際、システムを総当たり攻撃するためには、そうする必要があります。

私は実際にこれを実装する予定はありませんが、これが実際にシングルの標準的な方法よりも改善されているかどうかに興味がありkey = Hash(user_salt + password)ます。

編集:

多くの良い答えがあるので、ここで推測すると、これは振り返ってみると明らかなはずですが、2つのアルゴリズムの弱い方の一致を他方に対して試すことができるため、両方を使用して最も弱いリンクを作成します。たとえば、弱い(速い)MD5とPBKDF2を使用した場合、最初にMD5をブルートフォースし、次に他の一致を試します。したがって、MD5(またはその他)を使用すると、実際に状況が悪化します。また、両方がより安全なセット(bcrypt + PBKDF2など)の中にある場合でも、どちらかが壊れることへの露出が2倍になります。

4

4 に答える 4

7

これが役立つ唯一のことは、衝突の可能性を減らすことです。あなたが言及するように、いくつかの欠点があります(最も弱いリンクは大きなものです)。

bcrypt衝突の可能性を減らすことが目標である場合、最善の解決策は、より大きなハッシュを持つ 単一の安全なアルゴリズム(たとえば)を使用することです。

于 2013-01-15T16:00:28.803 に答える
6

最新のハッシュアルゴリズムでは、衝突は問題になりません。重要なのは、データベース内のすべてのハッシュが一意であることを保証することではありません。本当のポイントは、データベースが盗まれたり、誤って譲渡されたりした場合に、攻撃者がユーザーの実際のパスワードを判断するのに苦労することを確実にすることです。そして、最新のハッシュアルゴリズムが間違ったパスワードを正しいパスワードとして認識する可能性は事実上ゼロです-これはあなたがここで得ているものよりも多いかもしれません。

明確にするために、あなたが衝突について心配するかもしれない2つの大きな理由があります。

  1. 「正しい」パスワードと指定された「間違った」パスワードの衝突により、「間違った」パスワードを持つユーザーが認証できる可能性があります。
  2. ユーザーBのパスワードがわかっている場合、2人のユーザーのパスワードが衝突すると、ユーザーAのパスワードが「明らかに」なる可能性があります。

懸念事項1は、強力で最新のハッシュアルゴリズムを使用することで対処されます(パスワードハッシュのみに基づいてユーザーレコードを検索するなど、ひどく反華麗なものを回避します)。懸念事項2は、適切なソルティング(パスワードごとに「長い」一意のソルト)で対処されます。強調させてください、適切な塩漬けはまだ必要です。

ただし、ハッシュをミックスに追加すると、潜在的な攻撃者により多くの情報を提供することになります。現在、ハッシュのペアからメッセージデータ(パスワード)を「三角測量」する既知の方法があるかどうかはわかりませんが、別のハッシュを含めることで大きなメリットは得られません。追加情報を活用する方法があるというリスクを冒す価値はありません。

于 2013-01-15T16:02:29.640 に答える
4

あなたの質問に答えるには:

ユニークな塩を持っていることは、一般的な塩を持っていることよりも優れています。H(S1 + PW1)、H(S2 + PW2)複数のアルゴリズムを使用する方が、単一のアルゴリズムを使用するよりも優れている場合がありますH1(X)、H2(Y)(ただし、svidgenが言及しているように、おそらくそうではありません)

ただし

この質問の精神は、2つの理由で少し間違っています。

  1. セキュリティの専門家からの指導なしに、独自のセキュリティプロトコルを考え出すことはできません。それがあなた自身のアルゴリズムではないことは知っていますが、ほとんどのセキュリティ問題は、誤って使用されたために始まります。アルゴリズム自体は通常気密です。

  2. データベースにパスワードを保存するためにハッシュ(ソルト+パスワード)を使用しないでください。これは、ハッシュが高速であるように設計されているためです-安全ではありません。今日のハードウェア(特にGPU処理)では、古いアルゴリズムでハッシュの衝突を見つけるのはやや簡単です。もちろん、衝突が問題にならない新しい安全なハッシュアルゴリズム(SHA-256またはSHA-512)を使用することもできますが、なぜチャンスをつかむのでしょうか。

このタイプの攻撃を阻止するのに時間がかかるように設計されたパスワードベースの鍵導出関数PBKDF2 )を検討する必要があります。通常、ソルティングとセキュアハッシュアルゴリズム(SHA-256)の組み合わせが必要であり、数十万回繰り返されます。

このような速度低下に気付かない場所にログインしているユーザーにとって、関数に約1秒かかることは問題ありません。しかし、攻撃者にとっては、試行ごとにこれらの反復を実行する必要があるため、これは悪夢です。ブルートフォース攻撃の速度を大幅に低下させます。

これを行うためのより良い方法として、PBKDF暗号化をサポートするライブラリを見てください。 Jasyptは、Java暗号化の私のお気に入りの1つです。

この関連するセキュリティの質問を参照してください:パスワードを安全にハッシュする方法 とこの緩く関連するSOの質問

于 2013-01-15T16:02:52.627 に答える
0

一般的な事前作成されたハッシュテーブルの使用を防ぐために、パスワードハッシュにソルトが追加されます。攻撃者は、ランダムなソルトと組み合わせた単語リストに基づいて、新しいテーブルを生成することを余儀なくされます。

前述のように、ハッシュはある理由で高速になるように設計されています。それらをパスワードの保存に使用するには、速度を落とす必要があります(ネストされた繰り返しの数が多い)。

独自のパスワード固有のハッシュメソッドを作成できます。基本的に、お好みのハッシュをにネストしてsalt+password繰り返します。

string MyAlgorithm(string data) {
  string temp = data;
  for i = 0 to X {
    temp = Hash3(Hash2(Hash1(temp)));
  }
}
result = MyAlgorithm("salt+password");

ここで、「X」は多数の繰り返しであり、適切なハードウェアで全体が少なくとも1秒かかるのに十分です。他の場所で述べたように、この遅延のポイントは、通常のユーザー(正しいパスワードを知っていて、1回だけ待機する)にとっては重要ではありませんが、攻撃者(すべての組み合わせに対してこのプロセスを実行する必要がある)にとっては重要です。もちろん、これはすべて学習のためであり、適切な既存のAPIを使用する方がおそらく簡単です。

于 2013-01-15T16:28:54.907 に答える