てもとツール
技術解説

SHA-256とMD5の違い|改ざん確認に使うのはどちらか

MD5は32桁、SHA-256は64桁のハッシュ値です。偶然の破損を見つけるだけならMD5でも足りますが、誰かが差し替えたかを確かめるなら、同じ値の別データを作れてしまうMD5は使えません。用途別の使い分けと、同じ文字なのに値が合わない原因を、実際の値で確かめます。

公開読了目安 約6分

SHA-256とMD5の違い|改ざん確認に使うのはどちらかのアイキャッチ画像

この記事の要点

  • MD5は16進数で32桁、SHA-256は64桁の値になる
  • MD5は、同じ値を持つ別々のデータを意図して作れる(衝突)
  • 偶然の破損の確認ならMD5でも足りるが、差し替えの確認にはSHA-256を使う
  • パスワードの保存には、MD5もSHA-256もそのままでは向かない
  • 改行1つ・空白1つで値は変わるので、合わないときは入力の違いを先に疑う
目次

MD5 と SHA-256 は、どちらもデータから決まった長さの「指紋」を作る計算です。 大きな違いは、MD5 では同じ指紋を持つ別々のデータを意図して作れることです。

ソフトのダウンロードページに並ぶ長い英数字や、社内で「MD5 で照合して」と頼まれる値が、この指紋です。 偶然の破損を見つけるだけなら MD5 でも足りますが、誰かが差し替えていないかを確かめるなら SHA-256 を使います。

長さの違いを実際の値で見る

ハッシュ値は、入力の長さに関係なく、計算方法ごとに決まった長さになります。 MD5 は 128 ビットで 16 進数 32 桁、SHA-256 は 256 ビットで 64 桁です。

abc の 3 文字を計算すると、次の値になります。

MD5     900150983cd24fb0d6963f7d28e17f72
SHA-256 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

値の長さを見れば、どちらで計算した値かの見当がつきます。 32 桁なら MD5、40 桁なら SHA-1、64 桁なら SHA-256 の可能性が高いと考えてよいでしょう。

MD5 が「破られた」とはどういうことか

ハッシュ値は、違うデータなら違う値になることを期待して使います。 違うデータなのに同じ値になる組を「衝突」と呼びます。

IETF の RFC 6151 によると、MD5 の衝突の組が初めて示されたのは 2004 年です。 その後の研究では、当時のノートパソコンで約 1 分、別の報告では 10 秒以下で衝突を作れたとされています。

衝突を作れると、「中身の違う 2 つのファイルなのに、MD5 は同じ」という組を用意できます。 片方を見せて値を確かめさせ、あとでもう片方に差し替えても、MD5 では見分けられません。

SHA-1 も同じ道をたどった

40 桁の SHA-1 は、2017 年に Google と CWI Amsterdam が初めて実用的な衝突を公表しました。 使った SHA-1 の計算は 9,223,372,036,854,775,808 回と発表されています。

NIST(米国立標準技術研究所)は 2022 年、SHA-1 を 2030 年末までに段階的に使わなくする方針を出しました。 移行先として挙げているのは、SHA-256 を含む SHA-2 と、SHA-3 の仲間です。

確かめたいことで選ぶ

同じ「ハッシュで確かめる」でも、相手が偶然か人かで選ぶ方式が変わります。

確かめたいことMD5SHA-256
偶然の破損使える使える
誰かの差し替え不向き使う
電子署名・証明書使わない使う
パスワードの保存使わない使わない
  • 偶然の破損: ダウンロード途中の欠けやコピーの失敗は、狙って同じ値にしたものではありません。偶然 MD5 が一致してしまう見込みはきわめて小さく、照合の目的は果たせます
  • 誰かの差し替え: 差し替える側が元のファイルづくりに関われるなら、同じ MD5 の別のファイルを前もって用意できます。誰が作ったかで安全さが変わる方式は頼れないので、悪意を想定するなら SHA-256 で照合します
  • 電子署名・証明書: RFC 6151 は、衝突への強さが要る電子署名のような用途で MD5 はもう受け入れられないとしています
  • パスワードの保存: OWASP は、Argon2id や bcrypt のような、わざと計算に時間がかかるよう作られた方式を挙げています

パスワードに MD5 や SHA-256 をそのまま使わないのは、計算が速すぎるからです。 ハッシュは元に戻す計算こそありませんが、4 桁の暗証番号なら 10,000 通りを全部計算すれば当たります。

照合で防げる差し替えは、値の受け取り先で決まる

ダウンロードしたファイルの SHA-256 が配布元の値と一致すれば、届いたファイルは配布元のものと同じだと考えられます。 ただしこれが言えるのは、比べる値そのものを信用できるときだけです。

配布元のサイトそのものが乗っ取られると、ファイルとページの値が一緒に書き換えられ、照合は一致してしまいます。 配布元のサイトの値と比べて見つけられるのは、転送中の破損や、ミラーなど別の置き場所から落としたファイルの差し替えまでです。

配布元ごとの差し替えまで疑うなら、配布元の電子署名で確かめられる値や、別に信頼できる経路で受け取った値と比べます。 署名の確かめ方は配布元ごとに違うので、配布元の案内に従ってください。

同じはずなのに値が合わないとき

ハッシュは、1 文字でも違えばまったく別の値になります。 値が合わないときは、改ざんより先に、入力がわずかに違っていないかを疑います。

abc の前後を変えたときの SHA-256 の先頭 8 文字です。

入力SHA-256(先頭8文字)
abcba7816bf
abc+改行(LF)edeaaff3
abc+改行(CRLF)552bab68
abc+空白5488613c
ABCb5d4045c

見た目は同じ abc でも、末尾の改行や空白で値は変わります。 Windows の改行(CRLF)と、Mac や Linux の改行(LF)でも別の値です。

  • echo の改行: コマンドの echo abc は、末尾に改行を足して出力します。abc だけの値と比べるなら、改行を足さない printf 'abc' を使います
  • ファイルの改行: ファイルの値は、ファイルに保存された改行のまま計算されます。中身を開いて貼り直すと、改行の形が変わって値が合わないことがあります
  • 表記の違い: 16 進数の大文字と小文字は、同じ値の書き方の違いです。Base64 で書いた値は見た目がまったく違いますが、中身が同じこともあります

文字で計算できる値なら、ハッシュ値計算ツールに入れて、MD5 と SHA-256 を同時に見比べられます。 大文字・小文字・Base64 の出力も切り替えられるので、表記の違いかどうかをその場で確かめられます。

ファイルの値は OS の機能で計算する

ハッシュ値計算ツールが受け付けるのは文字だけで、ファイルの値は計算しません。 ファイルの値は、パソコンに入っている機能で計算します。

Windows(PowerShell)  Get-FileHash ファイル名
Windows(コマンド)    certutil -hashfile ファイル名 SHA256
Mac                    shasum -a 256 ファイル名
Linux                  sha256sum ファイル名

Microsoft の説明では、Get-FileHash は何も指定しなければ SHA-256 で計算します。 出てきた値を、配布元が示した値と 1 文字ずつ見比べてください。 配布元ごとの差し替えを疑うときは、前の節の署名や別の経路の値を使います。

関連記事

まとめ

MD5 と SHA-256 は、どちらもデータの指紋を作る計算です。 MD5 は同じ指紋の組を作れるので、誰かの差し替えを疑う場面では SHA-256 を使います。

偶然の破損の確認なら MD5 でも用は足ります。 値が合わないときは、改行・空白・大文字小文字のような入力の違いを先に確かめてください。

参考・出典

本記事は上記の公的機関・公式情報源を参考にしています。最新の情報は各リンク先をご確認ください。

あわせて読みたい

同じテーマ・関連ツールの記事です。