web-dev-qa-db-ja.com

同一のSHA1ハッシュを取得することは可能ですか?

2つの異なる文字列S1とS2(S1!= S2)を考えると、次のことが可能です。

SHA1(S1) == SHA1(S2)

本当ですか?

  1. はいの場合-どんな確率で?
  2. そうでない場合-なぜないのですか?
  3. 入力文字列の長さに上限があり、重複が発生する確率は0ですか? ORはSHA1(重複の確率)の計算は文字列の長さとは無関係ですか?

私が達成しようとしている目標は、機密性の高いID文字列(おそらく親IDなどの他のフィールドと一緒に結合される)をハッシュすることです。そのため、代わりにハッシュ値をIDとして使用できます(たとえばデータベース内).

例:

Resource ID: X123
Parent ID: P123

クライアントが「X123-P123」を見ることができるように、リソースIDの性質を公開したくありません。

代わりに、新しい列hash( "X123-P123")を作成したいので、AAAZZZとしましょう。その後、クライアントはID AAAZZZのリソースをリクエストできますが、私の内部IDなどは知りません。

77
Andriy Drozdyuk

あなたが説明するものはcollisionと呼ばれます。 SHA-1は、個別の出力を生成できる入力として、より多くの個別のメッセージを受け入れるため、衝突が必ず存在します(SHA-1は、最大2 ^ 64ビットのビット文字列を使用できますが、160ビットのみを出力するため、少なくとも1つの出力値は数回ポップアップする必要があります)。この観測は、関数が「良い」ハッシュ関数であるかどうかに関係なく、出力が入力よりも小さい関数に対して有効です。

SHA-1が「ランダムOracle」(基本的にランダム値を返す概念オブジェクトのように振る舞うと仮定すると、入力で出力vを返すという唯一の制限がありますm、その後は常に入力m)でvを返さなければならず、任意の2つの異なる文字列S1とS2の衝突は2 ^(-160)でなければなりません。ランダムなOracleのように動作するSHA-1の仮定の下で、多くの入力文字列を収集する場合、約2 ^ 80個のそのような文字列を収集した後、衝突を観察し始めます。

(これは2 ^ 160ではなく、2 ^ 80です。2^ 80の文字列では、約2 ^ 159のペアの文字列を作成できます。これは、衝突に適用するとほとんどの人にとって驚きになるため、「誕生日パラドックス」と呼ばれます。誕生日については、 Wikipediaページ を参照してください。)

誕生日パラドックスアプローチはランダムOracleの最適な衝突検索アルゴリズムであるため、SHA-1はnotが実際にランダムOracleのように動作することを強く疑います。しかし、約2 ^ 63ステップで衝突を検出するはずの公開された攻撃があるため、誕生日パラドックスアルゴリズムよりも2 ^ 17 = 131072倍高速です。このような攻撃は、真のランダムOracleでは実行できません。気を付けてください、この攻撃は実際には完了しておらず、理論的なままです(一部の人々 試しましたが、十分なCPUパワーを見つけられなかったようです )(Update:2017年初頭、誰かdidは上記の方法で SHA-1コリジョン を計算し、予測どおりに動作しました)。それでも、理論は健全に見え、SHA-1はランダムなOracleではないようです。それに対応して、衝突の可能性に関しては、すべてのベットがオフになっています。

3番目の質問について:n-bit出力を持つ関数の場合、2 ^n個別のメッセージ。つまり、最大入力メッセージ長がnより大きい場合。バウンドmnよりも低い場合、答えは簡単ではありません。関数がランダムOracleとして動作する場合、衝突の存在の確率はmで低下し、線形ではなく、急峻なカットオフm = n/2。これは誕生日のパラドックスと同じ分析です。 SHA-1では、m <80の場合、衝突がない可能性があり、m> 80は少なくとも1つの衝突が存在する可能性が非常に高い(m> 160これで確実になります)。

「衝突が存在する」と「衝突を見つける」には違いがあることに注意してください。衝突が存在する必要がある場合でも、試行するたびに2 ^(-160)の確率があります。前の段落が意味するのは、(概念的に)2 ^ 160組の文字列を試すことができない場合、そのような確率はかなり無意味であることです。 80ビット未満の文字列に制限しているためです。

118
Thomas Pornin

はい ピジョンホールの原理 のために可能です。

ほとんどのハッシュ(sha1も)の出力長は固定されていますが、入力のサイズは任意です。十分に長く試してみれば、それらを見つけることができます。

ただし、暗号化ハッシュ関数(shaファミリー、mdファミリーなど)は、このような衝突を最小限に抑えるように設計されています。既知の最良の攻撃では、衝突を見つけるのに2 ^ 63回の試行が必要です。そのため、チャンスは2 ^(-63)で、実際には0です。

33
Henri

gitはIDとしてSHA1ハッシュを使用し、2014年にはstill既知のSHA1衝突はありません。明らかに、SHA1アルゴリズムは魔法です。今までに発見されていたように、あなたの長さの弦には衝突が存在しないことは良い賭けだと思います。ただし、魔法を信用せず、賭けをする人でもない場合は、ランダムな文字列を生成して、DBのIDに関連付けることができます。ただし、SHA1ハッシュを使用して最初に衝突を検出した場合、その時点でシステムを変更して、ランダムIDの「ランダム」ストリングとしてSHA1ハッシュを保持することができます。

6
Vladimir Kornea

ハッシュ関数ではほとんどの場合、衝突が発生します。これまでのところ、SHA1は予測不可能な衝突を生成するのに非常に安全でした。危険なのは、衝突を予測できる場合、同じハッシュ出力を生成するために元のハッシュ入力を知る必要がないことです。

たとえば、 Security Now ポッドキャストエピソード179の例のように、MD5に対する攻撃は昨年SSLサーバー証明書の署名に対して行われました。これにより、高度な攻撃者が不正なWebサイトの偽のSSLサーバー証明書を生成できましたそして、リアールのように見えます。このため、MD5署名付き証明書の購入を避けることを強くお勧めします。

4
spoulson

あなたが話していることは衝突と呼ばれます。 SHA1の衝突に関する記事を次に示します。 http://www.rsa.com/rsalabs/node.asp?id=2927

編集:だから別の回答者が鳩穴の原則LOLについて言及するように私をbeatりましたが、これを明確にするために、鳩の巣の原理と呼ばれる理由があります、その後、いくつかの鳩(入力値)は穴(出力値)を共有する必要があります。

3
AaronLS