web-dev-qa-db-ja.com

実装が公開されている場合、ハッシュアルゴリズムはどのように役立ちますか?

私は誤解しているかもしれませんが、argon2などのハッシュアルゴリズムを使用したい場合、それがどのように機能するかを見て誰かがそれを逆にするとどうなるのですか?

23
Jan Trindal

公開することはまさにそのポイントです。あなたはそれがどのように行われ、それを元に戻すことがどれほど難しいかを皆に示します。それは、1兆個のピース​​が入った巨大なジグソーパズルを見せているようなものですが、すべてのピースがその場所にあり、すべてをシャッフルします。あなたはすべてのピースがパズルを形成していること(あなたはそれを見たところです)を知っており、すべてを元に戻すのは非常に非常に難しいことを知っています。公開ハッシュは、それがどのように行われるか(結果)と、すべてを逆に行うことがどれほど難しいかを示します。

公開ハッシュ関数は、単なる数学演算のセットです。誰でも手動で操作を行うことができ(ごく一部のみ)、アルゴリズムが期待どおりに機能することを証明できます。誰もがそれを元に戻すことができますが、それは非常に長い時間(私たちの惑星のすべてのコンピューティング能力を組み合わせて数兆年)を要するため、それを元に戻すための最も費用効果の高い方法はブルートフォースです。

それがかなり基本的な安全でないハッシュ関数でない限り。

54
ThoriumBR

おそらくあなたが探している答えではありませんが、これを考慮してください。

3,481,031,813のような10桁の数値を取り、ペンと紙だけで正方形であることを確認します(つまり、それ自体で乗算します)。退屈ですが、これは比較的簡単で、しばらくすると達成できます。

同じペンと紙で、20桁の数値の平方根を計算してみましょう。これは、最初のタスクの逆ですが、muchより難しいタスクです。

数学関数を作成できるため、逆関数を解くのがはるかに困難になります。ハッシュの1つの方法は、これを論理的な結論に導きます。関数は非常に難しいため、実際には解けません。

さらに、情報は途中で失われるという事実。 2の2乗は4ですが、4の平方根は+2と-2の両方です。元の数の符号が何であったかに関して、平方関数中に情報が失われました。ハッシュ関数もこれを効果的に行います。10GBのファイルを256ビットのハッシュに圧縮すると情報が失われ、元のメッセージを再構築する方法がなくなります。

53
keithRozario

私はあなたを完全に満足させる答えを出すことができるとは思いませんが、簡単な答えは、「暗号化ハッシュ関数」と呼ばれるもののために、この種のリバースエンジニアリングができるほど複雑である必要があるということです簡単ではありません。それが不可能だと言っているわけではありませんが、誰かが暗号ハッシュ関数をリバースエンジニアリングして少しでも進歩したらすぐに、それが壊れていると考え、より強力なものに移動します。暗号化ハッシュ関数のプロパティの詳細については こちら(wikipedia) を参照してください。

例として、SHA-1を見てみましょう。暗号化ハッシュ関数のプロパティは次のとおりです。

  • プリイメージ耐性
  • 2番目のプリイメージ耐性
  • 衝突抵抗

2005年に、約2秒間で衝突を発見できる攻撃が発明されました60 操作。それは、その攻撃を実行するためにまだ何百万ドルもあり、私が知る限り、他の2つの暗号プロパティ(プリイメージと2番目のプリイメージ)への攻撃はまだありませんが、SHA-1を検討するには十分です完全に壊れた。

9
Mike Ounsworth

あなたはそれらを逆にすることができないからです。

基本的に、それがとても簡単なら、なぜあなたはそれをしませんか?さて、以前はより単純なハッシュ関数があり、人々はそれらを逆にする方法を見つけました、そして他の人々はそれを作ったのでそれらの方法は機能しませんでした。今では、誰もリバースする方法を知らないハッシュ関数があります。

実際にMD4のようなものを試してリバースし、どこに行き詰まっているかを確認することは、賢明なことかもしれません。次に、MD4 だったが逆転した方法を調べます。この最後の部分では、学術論文を見つけて読む必要があります-大学生で、大学が論文をアップロードする場所へのアクセスを提供するために支払う場合、これはより簡単ですが、多くの場合、それらを見つけることができます他の場所のインターネット。

8
user253751

たとえを言えば、「ハッシュ関数の仕組み」を知ることは、「パンケーキのレシピを知ること」と同じです。それは簡単です:小麦粉、水、卵、塩と砂糖をつまみ、それらを混ぜ合わせてから、熱い油を鍋に入れ、その後ジャムまたは好きなものを入れます。

シンプルで高速、簡単な方法とその知識(ハッシュ関数の動作方法の知識と同じ)が公開されている(リバースエンジニアリングを行う必要さえない)

ここで、「ハッシュを元に戻す」必要があります。同じパンケーキの類推を適用してください-あなたは素晴らしい完成したおいしいホットジャムのパンケーキを持っていて、そこから「オリジナルの生のスクランブルエッグ」を抽出したいと思っています。

それで頑張ってください-「パンケーキを作るリバースエンジニアリングプロセス」がそれを達成するのを助けることはありません。

暗号化ハッシュ関数で使用される数学と同じように機能します-ある方法で行うのは非常に簡単ですが、逆に行う方法はありません。

4
Matija Nalis

TL; DR;暗号化ハッシュ関数は、オープンに設計されているかどうかに関係なく、一方向になるように設計されています。


まず、Argon2は、必要なユーザーのためのパスワードハッシュアルゴリズムです。

  • 遅い:パスワードの検索にはより多くのコストが必要になる
  • 大容量メモリ要件:ASIC/FPGA/GPUでの並列検索は禁止されています
  • サイドチャネル攻撃(この場合はArgon2i)を防ぐためにdata independence

パスワードハッシュの場合、衝突耐性は必要ありません。プリイメージ耐性が必要です。

SHA2、SHA3、Blakeシリーズなどの暗号化ハッシュ関数の場合、最初の要件は衝突耐性です。衝突抵抗を取得したら、プレイメージ抵抗を設定できます(2番目に証明されていることは、最初に大きな入力を必要とするトリッキーであることを意味します)。

それがどのように機能するかを見て誰かがそれを逆転させるのを止めているのは何ですか?

現代の暗号化では、 Kerckhoffsの原則 を使用します。つまり、鍵を除いて、すべてが公開されます。すべての暗号化ハッシュ関数がキーレスであるとは限りません。HMACやNMACなどのキー付きハッシュ関数があります。

ハッシュ関数は、任意のサイズの長さと固定出力サイズで機能するように設計されています。これは意味します。

  • ピジョンホール原理により、衝突は避けられません。
  • 何らかの方法でハッシュ関数のプリイメージを見つけた場合、追加情報なしでは、それがプリイメージであるかどうかを判断できません。

したがって、リバーシブルであることは望ましくありませんが、適切に設計されたハッシュ関数に対するそのような攻撃はありませんが、あまり役に立たない場合があります。

なぜ元に戻せないのか;

正確な答えは、ハッシュ関数の設計によって異なります。たとえば、SHA256シリーズを見てみましょう。それらは圧縮機能を使用し、それはメッセージが鍵である高度に反復されたブロック暗号によって設計されています。以前の256ビットをプレーンテキストとして、現在の512ビットメッセージをキーとして取り、256ビット出力を生成する圧縮関数。内部では、ブロック暗号のラウンド関数はAND演算を使用します。 AND操作では情報が失われるため、元に戻せません。したがって、ハッシュされた256ビットのメッセージ(パディングが必要)しかなくても、圧縮関数は元に戻せないため、元に戻すことはできません

これは、暗号化ハッシュ関数を攻撃できないという意味ではありません。 MD5には衝突攻撃があり、SHA-1には衝突攻撃があり、最近これはメッセージ偽造( SHA-1に対する攻撃のリスト )になりました。

4
kelalaka

数学的な方法から問題を見てみましょう。議論のために、ハッシュ関数は単なる任意の関数であると仮定しましょう。たとえば、f(x)いくつかの入力セット[〜#〜] x [〜#〜]から出力セット[〜#〜] y [〜#〜]

だからあなたは尋ねています:私が知っているならfそして私はy理由を知っていますxを単純に見つけられないf(x)= y?暗号化の美しさ(そしてそれが理にかなっている唯一の理由)は、f(x)= yを解くことがめちゃくちゃであるように設計された関数があることですfyが何であるかを正確に知っている場合でも、難しいです。

これは単なる数学であり、いくつかの方程式は難しいです。実際、一部の関数(SHAファミリなど)については、これらの方程式を解くための効率的な方法が知られていません。これは プリイメージ抵抗 とも呼ばれ、基本的な暗号的に安全な機能の特徴。

1
freakish

簡単に元に戻すことができる数学演算があります。たとえば、「加算312,579」は、「減算312,579」を実行することで簡単に逆転できます。 Argonが簡単に元に戻せる操作のみを使用した場合、それを元に戻すことができる場合があります。そうではありません。

元に戻すことができない非常に単純な操作は、x ^ 3を法としてpを計算することです。ここで、pはいくつかの大きな数です。私があなたに数値yを与え、y = x ^ 3 modulo pであると言った場合、pに関するいくつかの追加情報を与えない限り、妥当な時間内にxを見つける既知の方法はありません。 (これがおおよそRSAの基本です)。

任意の大量のデータを固定サイズのデータ​​にハッシュするハッシュの場合、多くの異なる入力値が同じハッシュ出力を生成するという問題もあります。したがって、ハッシュ関数不可は可逆的です。 (ただし、ハッシュされたパスワードの場合、ハッカーは「正しい」ハッシュで「間違った」パスワードを見つけた場合、その「間違った」パスワードも機能するため、ハッカーを止めることはできません。そのような「間違った」パスワードを見つける可能性はゼロです)。

1
gnasher729

keyが非公開である限り、(良い)暗号化アルゴリズムを公開できることをすでに受け入れていますか?もしそうなら、このアナロジーを検討してください:

何かを暗号化する場合、ブルートフォースで無数のキーを試すことを除いて、キーなしで暗号化を元に戻すことはできません。

この類推の目的では、ハッシュは似ていますが、元のメッセージもキーとして使用されますしたがって、メッセージがない場合は、あなたには鍵がありません。キーがないとハッシュを元に戻すことはできません。総当たりで何十億ものキーを試すことを除いて。

(技術的には、このようにして暗号化アルゴリズムからハッシュのようなアルゴリズムを作成できますが、作成するべきではありません。暗号化ハッシュ関数に必要な特性がない場合があります。)

*ここでの正しい単語はverifyですが、類似点はありません。

0
Artelius

何かをハッシュするプロセスではほとんどの情報が失われるため、ハッシュを元に戻すことはできません。ハッシュアルゴリズムのすべての単一の結果に対して、同じ結果を与える無限の数の異なる入力があります。

最も単純なハッシュアルゴリズムの1つである単純なチェックサムについて考えてみます。ランダムな本から1ページを選択したとします。ページの各文字について、文字をA = 1、B = 2などの数字に変換し、数字を加算します。最も単純なチェックサムについては、これで終わりです。

友人がこれを行って28543の結果を返した場合、どの本とどのページを彼らが見ていたかをどのように把握しますか?現在、チェックサムは単純すぎるため、通常、実際にはハッシュ関数とは見なされません。 collisionの検索と呼ばれる、同じチェックサムを与える入力を見つけたり、構成したりするのは非常に簡単です。 1つの方法は次のとおりです。28543のチェックサムを26で除算して、21が残った1097 Zを与えます。これはUです。チェックサムも操作が簡単です。自分の本で28540まで追加されたページを見つけたとしましょう。まあ、最後にCを追加するだけで同じチェックサムを取得できます。

暗号化ハッシュは、衝突を見つけるのが非常に困難になるように注意深く設計する必要があります。それらは同様の入力が完全に異なる出力を与えることを保証します。理想的には、入力の1ビットのみを変更すると、出力ビットの半分が反転します。しかし、それでも、十分な計算能力があれば、衝突を見つけることができます。そして、衝突が役に立つ場合があります。コンピュータがパスワードをハッシュする場合、衝突を見つけることができれば、最初にハッシュされたパスワードとは異なる場合でも、見つけたものでログインできます。 2つのパスワードのハッシュが同じである場合、コンピューターはそれらを区別できません。しかし、衝突が見つかったとしても、これはreversingハッシュアルゴリズムと同じではありません。衝突を検出しても、最初にハッシュされた無限入力はわかりません。

0
curiousdannii

特に良いまたは悪いハッシュ関数ではありませんが、深い数学なしでは元に戻すのが非常に難しいハッシュ関数の例:

64ビット整数xを取ります。ハッシュh(x)を計算するには、100桁の精度でsin(x)を計算し、ハッシュコードとしてsin(x)の数字81〜100を使用します。わかりました。計算はそれほど簡単ではなく、少し時間がかかりますが、それほど難しくもありません。

さて、私があなたに罪(x)の81から100までの数字を与えるとしたら、どうやってxを見つけるのでしょうか?最初の20桁は、適切な情報を提供します。ただし、最初の80桁はありません。あなたはxが整数であることを知っているので、理論的に問題を解決できますが、正しいものを見つけるまで、x = 1、2、3などのsin xを計算するよりも優れたアルゴリズムはないようです。最悪の場合、sin(x)で2 ^ 64値xをチェックする必要があります。

0
gnasher729