SHA-256でハッシュ値が一致した2ファイルから考えられること
情報セキュリティマネジメント試験 令和5年度 問5 / セキュリティ › 情報セキュリティ
過去問にチャレンジ
セキュアハッシュ関数SHA-256を用いてファイルA及びファイルBのハッシュ値を算出すると,どちらも全く同じ次に示すハッシュ値n(16進数で示すと64桁)となった。この結果から考えられることとして,適切なものはどれか。 ハッシュ値n:86620f2f 152524d7 dbed4bcb b8119bb6 d493f734 0b4e7661 88565353 9e6d2074
- ア
ファイルAとファイルBの各内容を変更せずに再度ハッシュ値を算出すると,ファイルAとファイルBのハッシュ値が異なる。
- イ
ファイルAとファイルBのハッシュ値nのデータ量は64バイトである。
- ウ
ファイルAとファイルBを連結させたファイルCのハッシュ値の桁数は16進数で示すと128桁である。
- エ
ファイルAの内容とファイルBの内容は同じである。
会話形式の解説
講師今回はSHA-256というハッシュ関数の性質を問う問題です。押さえたいのは3点で、出力の長さが決まっていること、同じ入力からは必ず同じ値が出ること、違う入力が同じ値になる『衝突』がきわめて起きにくいことです。
受験者ハッシュ値が同じなら中身も同じ、という選択肢が正解に見えます。ただ、データ量が64バイトという選択肢も、64桁と書いてあるので合っている気がして迷いました。
講師そこは換算で確かめましょう。SHA-256の出力は256ビットです。16進数1桁は4ビットを表すので、256÷4で64桁になります。では、1バイトは何ビットでしょうか。
受験者8ビットです。256÷8で32バイトですね。64は桁数であって、バイト数ではないということですか。
講師そのとおりです。この問題では、64バイトとする選択肢が桁数とバイト数を取り違えさせるものになっています。数字だけで判断せず、式で確かめるのが大切です。
受験者2つのファイルを連結したファイルのハッシュ値が128桁になる、という選択肢はどうでしょう。入力が2倍になるので、出力も2倍になりそうに思えます。
講師そこがハッシュ関数の特徴です。入力がどれだけ長くても、SHA-256の出力は常に256ビットの固定長です。連結したファイルでも16進数で64桁のままで、2ファイル分の桁数が足し算されることはありません。
受験者内容を変えずに再計算すると、2つのハッシュ値が異なるという選択肢は、計算するたびに値が変わるという意味でしょうか。
講師はい、そういう主張ですが誤りです。ハッシュ関数は同じ入力に対して何度計算しても同じ値を返します。再計算してもどちらのファイルも元の値になるので、一致したままです。
受験者残るのは、2つのファイルの内容が同じだという選択肢ですね。ただ、衝突が起きる可能性はゼロではないのですよね。
講師よく気づきました。厳密には衝突の可能性が残るので、数学的な証明にはなりません。ただ、衝突はきわめて起きにくいため、ハッシュ値が一致すれば実用上は内容が同一と判断できます。設問は『考えられること』を問うているので、これが適切な答えです。
受験者整理すると、出力は固定長で256ビット、つまり16進64桁で32バイト。同じ入力なら同じ値。そして一致すれば実用上は同一とみなせる、ということですね。
講師そのとおりです。この性質があるので、ハッシュ値の一致はファイルが同一かどうかの確認や改ざんの検知に使われています。衝突がゼロではないという厳密な話と、実用上は同一とみなせるという判断を区別して覚えておくとよいでしょう。
まとめ
SHA-256は、入力の長さに関係なく常に256ビットの固定長の値を出力するハッシュ関数です。256ビットは16進数で64桁、バイト数では32バイトなので、64バイトとする説明や、ファイルを連結すると128桁になるという説明は誤りです。同じ入力からは何度計算しても同じ値が得られ、異なる入力が同じ値になる衝突もきわめて起きにくいため、ハッシュ値が一致すれば実用上はファイルの内容が同じだと判断できます。厳密には衝突の可能性が残る点と、実用上は同一とみなせる点を区別して理解しておきましょう。
解答・解説
正解はエです
この問題のテーマ
SHA-256の性質(出力が固定長であること、同じ入力からは必ず同じ値が出ること、衝突が起きにくいこと)を理解し、2つのファイルのハッシュ値が一致したときに何が言えるかを問う問題です。
解き方の考え方
まず、SHA-256の出力は入力の長さに関係なく256ビットの固定長だと押さえます。16進数1桁は4ビットなので256÷4=64桁、1バイトは8ビットなので256÷8=32バイトです。64桁という問題文の記述とも合っています。そのうえで、計算が決定的であることと、衝突がきわめて起きにくいことから、各選択肢を確かめていきます。
選択肢ごとの解説
- ×ア ファイルAとファイルBの各内容を変更せずに再度ハッシュ値を算出すると,ファイルAとファイルBのハッシュ値が異なる。内容を変えずに再計算すれば両者のハッシュ値が異なる、という説明は誤りです。ハッシュ関数は同じ入力に対して常に同じ値を返します。再計算してもファイルAとファイルBはどちらも元のnになるため、両者は一致したままです。
- ×イ ファイルAとファイルBのハッシュ値nのデータ量は64バイトである。ハッシュ値nのデータ量を64バイトとする説明は誤りです。64は16進数で表したときの桁数で、バイト数ではありません。256ビット÷8=32バイトが正しいデータ量です。
- ×ウ ファイルAとファイルBを連結させたファイルCのハッシュ値の桁数は16進数で示すと128桁である。連結したファイルCのハッシュ値が128桁になる、という説明は誤りです。SHA-256は入力が長くなっても出力は256ビットのままで、16進数では64桁です。2ファイル分の桁数が足し算されることはありません。
- ○エ ファイルAの内容とファイルBの内容は同じである。ファイルAとファイルBの内容が同じだという考え方が適切です。同じ入力からは同じハッシュ値が得られ、異なる入力が同じ値になる衝突はきわめて起きにくいため、ハッシュ値が一致すれば実用上は内容が同一と判断できます。厳密には衝突の可能性が残るので数学的な証明にはなりませんが、設問の「考えられること」としてはこれが当てはまります。
補足
「16進64桁」を「64バイト」と読み違えさせるのは定番の引っかけです。桁数・ビット数・バイト数の換算は必ず式で確かめてください。また、衝突がゼロではないという厳密な話と、実用上は同一とみなせるという判断は区別して覚えておくとよいでしょう。
POINT
- SHA-256の出力は、入力の長さに関係なく常に256ビットの固定長です。
- 256ビットは、16進数では64桁(256÷4)、バイト数では32バイト(256÷8)です。
- 同じ入力を同じハッシュ関数にかけると、何度計算しても同じ値になります。
- ハッシュ値の一致は、ファイルが同一であることの確認や改ざんの検知に、実用上の根拠として使われます。
