こちらの頁によると
- 暗号化目的
たとえば、文書が改竄されていないかをチェックするに当たって、何メガバイトもある全文に対して処理するより、僅かなビット数のハッシュ値に対して操作するほうが容易ですし、また適切なハッシュ関数を選べば、ハッシュ値から元の値に関する情報を得られないようにすることもできます。
SSL証明書の電子署名も、証明書全体ではなく、ハッシュ値に対して行っています。少し前にSHA-1からSHA-2への切り替えというのが話題となりましたが、この2つもハッシュ関数の名称です。
とあります。つまり何か悪戯されてないか調べたい対象をハッシュ知にして、そのハッシュ値を調べることで結果がわかるし、ハッシュ化するまえよりいろいろとらくちんだと認識しました。
ところでハッシュ値をどう調べると悪さされていないかわかるのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
ハッシュというのは元の大きなデータを不可逆圧縮したものです。
例えば整数を 2 で割って余りを求めると 0 か 1 の二種類になりますが、どんな大きな整数でもこの二種類になるので 1 ビットで表せるようになります。
これがハッシュ値です。
ハッシュ値はそれを求めるアルゴリズムによって変わり、この場合は 2 の剰余を求めるアルゴリズムを使っています。
別のアルゴリズムを使えば別のハッシュ値になります。
さて、元の整数が 132 だったとするとこのアルゴリズムではハッシュ値は 0 になるわけですが、これが 133 に書き換えられるとハッシュ値が 1 に変わります。
これによって値が書き換えられたことがわかるわけです。
2 の剰余を求めるアルゴリズムの場合は 132 が 134 に書き換えられてもわかりません。
同じくどんなアルゴリズムを使ってもそのような場合はあります。
ただ、SHA-1 などではそのような場合になる確率が極めて小さくなるよう工夫してありますので「書き換えられたかどうかが高確率でわかります」ということです。
必ずわかるわけではありません。
投稿2018/03/09 11:39
総合スコア28660
0
文章を読むだけでは分からないでしょうね。
具体的な例としてハッシュ化アルゴリズムの一つ、MD5を紹介します。
- どんな文字列からでも、16進数32文字になる
- 同じ文字列に対して変換かければ必ず同じハッシュ値が生成出来る
- ハッシュ値は元の文字列に公式を当てはめて無理やり32文字に変換させているので戻せない
因みに殆どのハッシュアルゴリズムは2や3の特徴は同じだったりします。
16進数32文字になるのはMD5の仕様です。
MD5ハッシュ計算ツールを紹介するので、色んな文字を試しに変換してみてください。
悪さされてないかを調べる方法
例えば私が「こんにちは」という文字列を友達に贈ろうとします。
こんにちはをMD5に変換かけると「2316c3ccdb7049dc4b38bb8453e3f538」になります。
MD5は16進数32文字なので128bitです。
2つの文字列をMD5に変換した時に「完全に一致」する確率は「1/2の128乗」です。
なんかしょぼい?
いやいや、128乗ですのでちょっと計算を工夫して…「1,024の12乗に256を掛けた数字」になります。
1,024の2乗ですら100万分の1ですからね……
まぁ元のワードが分からない限り何度試そうが同じハッシュ値を作り出す事は不可能です。
要するに、私が「こんにちは」という文字列を友達に送りつつ、
MD5結果の「2316c3ccdb7049dc4b38bb8453e3f538」を送信したとします。
その場合、悪意の第三者が「こんにちは」という文字列を傍受して改ざんしようとしてもすぐにバレます。
ただし、コンピュータの力を借りて無理やり突破することは可能です。
例えば私がWordの文章で「こんにちは」と書いて渡したとしましょう。
全てのフォントが同じ文字列幅であるとは限りません。
変な値の文字列を挿入することで、不可視な文字を挿し込みつつ一見違和感のない文章を作る事も可能です。
それらを組み合わせて「さようなら」という文字列に改変し、
不可視の文字を大量に埋め込みながらMD5に変換して試して…を繰り返し、
何万文字とゴミデータを差し込み続け見事「2316c3ccdb7049dc4b38bb8453e3f538」の生成に成功したとしましょう。
そこで私が「あっ、さっき送った文書は5文字だからね」と言えばおしまいです。
ファイルにはサイズがありますからね。
ファイルサイズをピタリあわせつつ同じハッシュ値を生成することは極めて困難です。
複数の条件を組み合わせる事で、ハッシュの改ざんに対する牽制力は飛躍的に上がります。
こういった工夫を重ねながら改ざんしてもすぐに判明するという仕組みを構築しているのです。
投稿2018/03/09 12:23
編集2018/03/09 13:43総合スコア21158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ハッシュ関数、ハッシュ値については他の回答者様方が答えられているので、別なアプローチで。
データをやり取りする方法に「メッセージ認証コード」なるものがあるらしく、以下のような仕組みだそうです。
以下、
plain
1暗号化された元の文書 : X 2送受信者しか知らないハッシュ関数 : H 3ハッシュ値 : x (← これをメッセージ認証コード[Message Authentication Code、MAC]と呼ぶそうです。) 4 5間違った値の時 : ○! 6間違っているかもしれない値の時 : ○?
とする。
- 正常時
plain
1送信側 : X → H → x 2 3 ↓ Xとxを同時に送る 4 5受信側 : X → H → x → 合ってる
- 異常時
plain
1送信側 : X → H → x 2 3 ↓Xとxを同時に送る 4 5イタズラ 6 7 ↓X?、x?になる 8 9受信側 : X? → H → x?となる時 → 多分合ってる(「ハッシュ関数が漏れた」か、「[X!,x]で偶々ハッシュ値の衝突が起きた」か、など。イタズラが起きたかは不明) 10 11または 12 13受信側 : X? → H → y(≠x?)となる時 → X!であったか、x!であったか、またはその両方 → イタズラか障害が発生した
私は聞きかじっただけなので詳しいことはわからないですが…(^ ^;
事前にハッシュ関数(またはそれを生成するためのキー)自体も共通鍵暗号方式等で共有する必要があるみたいですね。(これが割れているなら完全な書き換えやなりすましが可能ですから…)
投稿2018/03/09 12:51
編集2018/03/10 03:11総合スコア2043
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。