web-dev-qa-db-ja.com

SHA-256をSHA-1およびMD5に変換-ビット長/エントロピーを増やしますか?

私はこれが本当のばかげた質問であることを知っています、そして私は確かに完全なゴミを話していますが、私に説明させてください:

  1. 長いSHA-256ハッシュがあります。例:474bfe428885057c38088d585c5b019c74cfce74bbacd94a7b4ffbd96ace0675(256ビット)
  2. 次に、長いハッシュを使用して1つのSHA-1と1つのMD5ハッシュを作成し、それらを結合します。例:c49e2143913627ea178e66571189628a41526bf3(SHA-1; 160bit )+ 6bb225025371aaa811748da8e011773d(MD5; 128bit

だから今これを得た:c49e2143913627ea178e66571189628a41526bf36bb225025371aaa811748da8e011773d
(SHA-1 + MD5; 160ビット+ 128ビット= 288ビット)

そして、それは入力文字列よりも長く、256bitの代わりに288bitを使用します。 それで、実際にエントロピーを増やしましたか?

要するにこれはこれです:

hash = sha256(input) # 256bit
result = sha1(hash) + md5(hash) # 288bit

(これは疑似コードであるはずですが、それが有効であるかどうかはわかりません。)

ここで推論のエラーは何ですか?この方法でエントロピー/文字列の長さを増やすことはできないと思います...

編集:また重要:エントロピーをこれまで減らしたか、同じままにしたのでしょうか?

4
rugk

また、入力文字列よりも長く、256ビットではなく288ビットです。では、実際にエントロピーを増やしたのでしょうか?

いいえ、エントロピーを増加させませんでした。

この文脈では、「エントロピー」とは基本的に、内容または値についての特定の推測が正しい確率を指します。

小文字の米国英語の文字のASCII表現をSHA256を使用してハッシュしたこと、およびハッシュが16進数のca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bbであると言った場合、その値のエントロピーは256ビットではなく、256ビットではありません。私がハッシュした文字がaであるという結論に達するには、せいぜい26推測するだけでよいので、5ビットに近い(log2(26)〜4.7)(完全を期すために、私が実際に行ったのは_printf 'a' | sha256sum -b_ UTF-8ネイティブシステム)

したがって、エントロピーは入力のエントロピーより大きくなることはありません。そして、入力はせいぜい256ビットのエントロピーを持つ初期ハッシュです。 (ハッシュした文字列のエントロピーが256ビット未満であり、攻撃者がそれとその値を何らかの方法で推測できる場合、それよりも少なくなる可能性があります。)各ハッシュ計算は、O(1) =入力サイズが固定の場合。

したがって、SHA-256ハッシュである文字列のSHA-1ハッシュとMD5ハッシュを連結することで、256ビットよりもエントロピーを決して得ることができません。あなたがしていることはそれを長くし、そしておそらくその起源を覆い隠すことです。

現在、状況によっては複数のハッシュを使用することは実際に意味があります。たとえば、多くのLinuxパッケージマネージャーは、同じファイルに対して複数の異なるハッシュを使用して検証します。これは、ハッシュ値のエントロピーを増やすために行われるわけではありません有効な衝突を見つけるのを難しくするために行われます。このような状況では、プリイメージまたは衝突攻撃は、使用されるすべてのハッシュに対して等しく機能する必要があるためです。最近の暗号ハッシュに対するこのような攻撃は、ほとんどの目的にとってすでに十分に困難です。複数の異なるハッシュに対して同様の攻撃を同時に行う(= /// =)と同時には、桁違いに困難になります。

24
a CVn

あなたは確かにエントロピーを追加していません。何回、どのようにこれを再ハッシュしても、このスキーマの出力は最大256ビットのエントロピーしかありません。入力にどれだけのエントロピーがあるかを私たちに教えていないため、最大 256ビットのエントロピーになることに注意してください。入力にそれより少ない場合、SHa256は256ビットのエントロピーも提供しません。ハッシュは決してエントロピーを増加させません。

しかし、可能なsha256の完全な値を考えると、実際には衝突のためにエントロピーが失われます。 256ビット値の一部は衝突します。つまり、sha1とmd5への256ビット入力の場合、x1とx2があり、sha1(sha256(x1))== sha1(sha256(x2))とmd5(sha256(y1) )== md5(sha256(y2))。出力が実際に少なくなった場合、そのためにエントロピーが失われます。

3
CristianTM

他の人が説明したように、「エントロピーのビット」は、SHA-256ハッシュを作成するために最初に使用された元のパスワードまたはその他のテキストの推測能力を指します。あなたの例の場合、エントロピーは変更されていません。

ここでは、SHA-1バージョンを提供していますおよび SHA-256のMD5バージョン。これにより、SHA-256は、使用できる他のソリューションよりも推測しやすくなります。

元の入力を推測しにくくする場合は、SHA-256関数を繰り返すだけです。実際、SHA-256を何千回も繰り返すと、サーバーの負荷やエンドユーザーのエクスペリエンスに顕著な影響を与えることなく、元の入力を総当たりにすることが非常に困難になります。

ただし、パスワードを保存する場合は、Saltを使用したスローハッシュとして設計された適切なパスワードハッシュ関数を使用することをお勧めします。これにより、運用ハードウェアで必要な処理時間に合うようにラウンド数(作業係数)を調整できます。通常、BCryptが推奨されます。 PBKDF2または新しいSCryptはどちらも良い選択です。

3
Bryan Field

エントロピーを増加させましたか?.

あなたがしたことは、2つの古いハッシュ関数を使用して新しいハッシュを取得することだけです。これには新しいデータがないため、エントロピーは影響を受けません。

ここでのビット数はまったく違いがありません(元のハッシュを「別の方法で書き込む」ため)。

(暗号化における)エントロピーは、特定のビットが「0」または「1」である不確実性の量と関係があります。これを増やすには、単に(より低い程度に)リハッシュするだけでなく、「新しい」データが必要です。元のハッシュ関数を使用して再ハッシュするときは、ほとんどの場合、smaeレベルのエントロピーを維持できます。それ以来、ビットを失うことはありません。

1
LvB