ファイルのダイジェスト(Checksum)を検証する

ダウンロードしたファイルが壊れていたら? ダウンロード中に誰かが改ざんしていたら? それを知る方法のひとつにダイジェスト(Digest)がある. チェックサム(Checksum)という言葉も使われる. MD5,SHA-1,SHA-256という3つのアルゴリズムが有名どころ. いずれもファイルのハッシュ値を算出するアルゴリズム. ではハッシュ値とは? 例えば d41d8cd98f00b204e9800998ecf8427e といった英数字の羅列. これがハッシュ値. 今回はMD5で0バイトのファイルのハッシュ値を算出した. さて,ファイルサイズに関わらず,MD5ハッシュアルゴリズムはいつも32文字=256bitを出力する. これがハッシュの良いところ. もうひとつの良いところは入力するファイルのデータが1bitでも変わると,全く異なる英数字が出力されるところ. ハッシュ値が違うということは別のファイル(もしくは壊れたファイル)であることの判断材料になる. だからDigest(要約)と呼ばれる. Checksumという単語はデータの整合性をチェック(Check)するためのデータの合計値(Sum)という意味合い. つまり,データが壊れていないかどうか,判定する時に使用されるデータのことをChecksumと呼んだりする.
HandBrakeの公式サイトへ行くと,ダウンロードページには次のような表記がある.
File Name: HandBrake-1.2.2.dmg
File Size (MB): 19.69 MB
SHA 1:  5effaa1b39aefc95981117419a1af94b5c573cdd
SHA 256: 690e5bb3cc668b6e4c74bdbe43095c3693e55a06c1e5f1b330420f7c2a406c8e
HandBrake-1.2.2.dmgというファイルのハッシュ値が書かれている. SHA-1とSHA-256のハッシュ値が書かれている. ハッシュ値はアルゴリズムの種類(例えばMD5かSHA-256か)で出力される文字数(bit数)が異なる. MD5は32文字だったが,SHA-256は64文字=512bitだ. さて,HandBrakeのダウンロードページが意味するのは,ダウンロードしたファイルのハッシュ値を求めて,ここに書かれているハッシュ値と同じだったらデータはきちんとダウンロードされましたよ,ということ. macOSの場合,ハッシュ値を求めるのは簡単. まず,Terminal.appを開く. そして,次のコマンドでハッシュ値が求まる. openssl dgst -md5 ファイル名 これはMD5のハッシュ値. SHA-1は次の通り. openssl dgst -sha1 ファイル名 SHA-256はこう. openssl dgst -sha256 ファイル名 もうお分かりだろう. このコマンドさえ覚えておけば,お望みのファイルのハッシュ値をすぐに求めることが出来る.
さて,ハッシュ値を求めることが出来たので,これを比較すればファイルの整合性を確かめることが出来るわけだが,いちいち人力で一文字ずつチェックするのはスマートではない. ワンライナーで一致しているか否かを確かめることは出来るが,せっかくなのでシェルスクリプトのお勉強も兼ねて,ファイルのハッシュ値と与えられたハッシュ値が等しいかを確かめてくれるシェルスクリプトをつくった. digestChecker.sh | GitHub.com

digestChecker.sh

#!/bin/bash

function printUsage () {
  echo 'USAGE: digestchecker [option] file checksum'
  echo 'Available options:'
  echo -e '\t--md5'
  echo -e '\t--sha1'
  echo -e '\t--sha256'
  exit 1
}

if [ $# -gt 2 ]; then

  # option(argument) specified
  file="$2" # File name
  checksum="$3"  # Checksum value

  if [ ! -f "$file" ] || [ -f "$checksum" ]; then
    printUsage # exit with code 1
  fi

  case $1 in
    --md5    ) declare -a md5=($(openssl dgst -md5 "$file")) ;;
    --sha1   ) declare -a sha1=($(openssl dgst -sha1 "$file")) ;;
    --sha256 ) declare -a sha256=($(openssl dgst -sha256 "$file")) ;;
    *        ) printUsage ;; # exit with code 1
  esac

else

  # no option(argument) found
  file="$1" # File name
  checksum="$2"  # Checksum value

  if [ ! -f "$file" ] || [ -f "$checksum" ]; then
    printUsage # exit with code 1
  fi

  # Each variables 'md5', 'sha1' and 'sha256' are arrays.
  # - The first item is a file name.
  # - The second item is a checksum.
  declare -a md5=($(openssl dgst -md5 "$file"))
  declare -a sha1=($(openssl dgst -sha1 "$file"))
  declare -a sha256=($(openssl dgst -sha256 "$file"))

fi

function matched () {
  echo $1
  echo '+------------+'
  echo '|  Matched!  |'
  echo '+------------+'
  exit 0
}

case "$checksum" in
    "${md5[1]}") matched 'MD5 Digest Algorithm' ;; # exit with code 0
    "${sha1[1]}") matched 'SHA-1 Digest Algorithm' ;; # exit with code 0
    "${sha256[1]}") matched 'SHA-256 Digest Algorithm' ;; # exit with code 0
esac

# Not matched...
echo '+-------------+'
echo '| Wrong File! |'
echo '+-------------+'
exit 2
このシェルスクリプトを使えば,簡単にハッシュ値の一致不一致を確かめることが出来る. 使い方はこんな感じ. digestChecker ファイル名 ハッシュ値 対応するダイジェストアルゴリズムはMD5,SHA-1,SHA-256. 次のように,ダイジェストアルゴリズムを指定することでより高速にチェックできる. digestChecker --md5 ファイル名 ハッシュ値 digestChecker --sha1 ファイル名 ハッシュ値 digestChecker --sha256 ファイル名 ハッシュ値
まず,GitHubからスクリプトをダウンロードしたら,適当なところにファイルを移動させて,ターミナルを開き,そのパスまでcdコマンドで移動. ここでは`~/Documents/Scripts/`内へ移動したこととする. そして sudo chmod +x digestChecker.sh で実行権限を与える. このとき求められるパスワードはmacOSにログインする時に入力するパスワード. 入力しても画面は変化しないがきちんと入力されているので迷わずreturnキー! さて,Bashをお使いの方は.bashrcファイルに次のエイリアスを追記. touch ~/.bashrc | nano bashrc

.bashrc

alias md5check="~/Documents/Scripts/digestChecker.sh --md5"
alias md5checker="~/Documents/Scripts/digestChecker.sh --md5"
alias sha1check="~/Documents/Scripts/digestChecker.sh --sha1"
alias sha1checker="~/Documents/Scripts/digestChecker.sh --sha1"
alias sha256check="~/Documents/Scripts/digestChecker.sh --sha256"
alias sha256checker="~/Documents/Scripts/digestChecker.sh --sha256"
alias digestcheck="~/Documents/Scripts/digestChecker.sh"
alias digestchecker="~/Documents/Scripts/digestChecker.sh"
Ctrl+xを押し,yを押し,returnで保存したら次のコマンドで`.bashrc`を適用. source ~/.bashrc さて,これで便利なコマンドが使えるようになった.
HandBrakeの公式サイトへ行き,HandBrakeの最新版をダウンロードしよう. 現時点での最新版は1.2.2だった. ファイル名はHandBrake-1.2.2.dmg. ダウンロードが完了したら次のようなコマンドを使ってSHA-1のダイジェストを検証できる. sha1checker ~/Downloads/HandBrake-1.2.2.dmg 5effaa1b39aefc95981117419a1af94b5c573cdd または digestChecker ~/Downloads/HandBrake-1.2.2.dmg 5effaa1b39aefc95981117419a1af94b5c573cdd もしターミナルに
SHA-1 Digest Algorithm
+------------+
|  Matched!  |
+------------+
と表示されればファイルの整合性が確認できたことを意味する.もし,
+-------------+
| Wrong File! |
+-------------+
と表示された場合,そのファイルは損傷しているか,別のバージョンをダウンロードしたか,第三者によって改ざんされた可能性がある. ちなみにSHA-256のチェックは次のコマンドでできる. sha256checker ~/Downloads/HandBrake-1.2.2.dmg 690e5bb3cc668b6e4c74bdbe43095c3693e55a06c1e5f1b330420f7c2a406c8e または digestChecker ~/Downloads/HandBrake-1.2.2.dmg 690e5bb3cc668b6e4c74bdbe43095c3693e55a06c1e5f1b330420f7c2a406c8e ただ,処理がかなり遅いので注意. とはいえ,今までの話しは前提として閲覧しているWebサイトが改ざんされていないことを前提としている. もしWebサイト上のハッシュ値まで改ざんされていたら,そこまではダイジェストチェックだけでは見抜くことは不可能. 良質なHTTPSの普及を望んで...
9111593329097634393 https://www.storange.jp/2019/05/checksum.html https://www.storange.jp/2019/05/checksum.html ファイルのダイジェスト(Checksum)を検証する 2019-05-29T22:00:00+09:00 https://www.storange.jp/2019/05/checksum.html Hideyuki Tabata 200 200 72 72