web-dev-qa-db-ja.com

SHA1衝突デモ/例

この質問は this に似ていますが、MD5衝突デモのみを参照しています。

これまでにわかっている任意のメッセージの実際のSHA1衝突ペアはありますか?

これらを使用して、さまざまなソフトウェア製品(自分のサードパーティ)がどのように処理するかをテストしたいと思います。

いくつかのGoogle検索を行うと、おおまかなMD5/SHA0の衝突と、SHA1の衝突を作成するためのアプローチに関するヒントが表示されるだけでしたが、どの例でも手に入れることができませんでした。

27
Archimedix

最初の既知の衝突が https://shattered.it/ で公開されました

8
Dave L.

2017年2月23日以降、この回答は正確ではなくなりました。

6年以上の間、インターネットセキュリティを支えるSHA1暗号化ハッシュ関数は死の扉を開いていました。「衝突」と呼ばれる致命的なエクスプロイトの最初の既知のインスタンスの提出により、今では公式に死んでいます。

SHA-1の既知の衝突はまだありません。たった今:

  • SHA-1のreducedバージョンには、標準のSHA-1の80ラウンド未満の衝突がいくつかあります。
  • アルゴリズムが説明されています。これは、2(おおよそ2に相当する計算労力でSHA-1衝突を取得する必要がある63 小さなメッセージに対するSHA-1の呼び出し。これは一般的なアルゴリズム(2を必要とするアルゴリズム)よりもはるかに優れています。80 平均的には呼び出し)ですが、それでもまだかなり大きく、そのアルゴリズムはまだ実行されていません。

全体を整理する [〜#〜] boinc [〜#〜] フレームワークを使用して、寄付するCPUクロックサイクルに余裕がある人から力を利用してSHA-1衝突を取得するための努力がありましたものの、十分なボランティアがいないため、その努力は昨年中止されました。したがって、実際のSHA-1衝突はまだありません。

理論的な攻撃は、わずかに誤っていることが判明する可能性があるいくつかの仮定に依存しています。たとえば、MD5への攻撃は実際には予想よりも少し高速です(ある時点で、理論上の確率2で満たす必要があるプロパティがあります。-28、しかし実際には2に似ています-27.7、つまり、攻撃は予測よりも20%高速です)。理論的な攻撃は正しく、複雑さは「かなり正確」であるとまだ考えられています。

32
Thomas Pornin

Googleのセキュリティブログでは、最初の公開された意図的なSHA-1衝突についてここで説明しています:https://security.googleblog。 com/2017/02/announcing-first-sha1-collision.html

同じSHA-1を持つ2つのPDFへの直接リンク( この発見専用サイト から):

再び、マークスティーブンスはCWIアムステルダムといくつかのGoogleの従業員と共に関与しましたが、今回は2つの作成されたPDFのフルラウンドのSHA-1のために。

Stevensも注 SHA-1の Merkle-Damgård構造 により、2つのPDFの両方を拡張できます(追加)同じ任意のデータを使用して、同じダイジェストにハッシュするより長いバージョンを生成します。

Googleは明らかに、付随するソースコードを今から90日後(2017年2月23日)に公開する予定であり、影響を受けるシステムサプライヤーに更新する時間を与える。

GitのようなソフトウェアとGitHubのようなサービスプロバイダーがこれをどのように処理するかは、特に下位互換性の観点からはまだ不明です。

Linus Torvaldsが git に関するステートメントを発行しました。互換性のある方法で新しいハッシュに移行しますが、時間がかかります。

ちなみに、「破砕された」衝突のデモは、次のようにSHA-1を使用しているため、gitには影響しません(変更なし)。

sha1("blob " + <size in octets as text> + "\0" + <contents>)

ファイルがgitにない場合でも、git hash-object <file path>を使用してgitハッシュを取得できます。

関連ニュースでは、Subversionがこの証明の最初の犠牲者であるようです 。これにより、リポジトリが破損し、前述のファイルが実用的に利用されます。

-以前は...-

76ラウンドの衝突Marc Stevens によって見つかりました。

[〜#〜] blake [〜#〜]SipHash の共同作成者である暗号学者Jean-Philippe Aumasson /および Password Hashing Competition(PHC) のイニシエーターは、80ラウンド全体でSHA-1の衝突を推測します が見つかります2020年までに-

Marc Stevens等による進行中の研究によると。 2015年10月に公開

... SHA-1衝突コストtoday(つまり、2015年秋)​​を75K $から120Kの間で推定します$数か月かけてAmazon EC2クラウドコンピューティングをレンタルしています。対照的に、セキュリティの専門家であるブルースシュナイアーは、SHA-1の衝突コストを2018年までに約173,000ドルと予測していました。

また、SHA-1の圧縮機能に対する衝突攻撃についても説明しています。

10
Archimedix

2005年のWang、Yin、Yuによる SHA1への衝突検索攻撃 の論文の例がありますが、弱められた58ラウンドバージョンのSHA-1のみを対象としています。 (完全な公式SHA-1は80ラウンドを実行します。)

3 A collision example for 58-step SHA1

         h₁ = compress(h₀,M₀) = compress(h₀,M'₀)
 _____________________________________________________
   h₀:  67452301 efcdab89 98badcfe 10325476 c3d2e1f0
 _____________________________________________________
   M₀:  132b5ab6 a115775f 5bfddd6b 4dc470eb
        0637938a 6cceb733 0c86a386 68080139
        534047a4 a42fc29a 06085121 a3131f73
        ad5da5cf 13375402 40bdc7c2 d5a839e2
 _____________________________________________________
   M'₀: 332b5ab6 c115776d 3bfddd28 6dc470ab
        e63793c8 0cceb731 8c86a387 68080119
        534047a7 e42fc2c8 46085161 43131f21
        0d5da5cf 93375442 60bdc7c3 f5a83982
 _____________________________________________________
   h₁:  9768e739 b662af82 a0137d3e 918747cf c8ceb7d4
 _____________________________________________________

Table 2: A collision of SHA1 reduced to 58 steps. The two
messages that collide are M₀ and M'₀. Note that padding
rules were not applied to the messages. 
4
Ben Robinson

厳密にはSHA1の衝突ではありませんが、 PBKDF2-HMAC-SHA1 メッセージダイジェスト認証コードの衝突があります。

たとえば、2つのパスワードplnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmdおよび_eBkXQTfuBqp\'cTcar&g*_、salt _hunter2_、_4_反復のPBKDF2(SHA1、password、salt、iterations、dkLen)は、同じ値を提供します(_35d1c8f259129dc800ec8e073bb68f995424619c_ for dkLen _20_)。

実際、64バイトより長い文字列でこのような衝突を見つけることは簡単です。

別の衝突の例(Python3):

_>>> import hashlib, binascii
>>> def pbkdf2sha1hex(x, salt, iters):
...     h = hashlib.pbkdf2_hmac('sha1', x, salt, iters)
...     return binascii.hexlify(h)
>>> pbkdf2sha1hex(b'http://stackoverflow.com/questions/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
>>> pbkdf2sha1hex(b'\x8c\xbf8\x94\xbc\xf4\xbe\x90xT,r\xbc\x03\xd1\xed\xd9\xea\xfb\x9f', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
_

同じ "問題"がPBKDF2-HMAC-SHA256にも適用されることに注意してください。

_>>> h1 = pbkdf2_hmac('sha256', b'http://stackoverflow.com/questions/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b"\xcf\xc5\xee\x15=\r\x0b\x0e\x89r\x9b\xe1\xb7'+\xa4'o\x98kn++u\x12\xec\xd9\xec\xea\xebL\xb7"
>>> h2 = pbkdf2_hmac('sha256', b'.\x83\xb0D\x93D\x9f\x162\xf3\xd4x\xb6\x1a\x9f-\x1f\xdb\xdc\xa4\x8f\xb3\x95Y5\xea\x99*\x97\x00V\x81', b'NaCl', 1000000)
>>> h1 == h2
True
_

PBKDF2の定義から、長い文字列の場合、次のことが成立するため、すべてが起こります。
PBKDF2(hashalgo, s, ...) == PBKDF2(hashalgo, hashalgo(s), ...)

詳細情報ここ: https://mathiasbynens.be/notes/pbkdf2-hmac

2
mykhal