ダウンロードしたファイルは悪意のあるクラッカーな人たちによって改変、改ざんされている可能性が有るわけです。
“ねこ”画像のリンクからダウンロードしたのに”かめ”画像だった、これくらいなら良いですが、ツールをダウンロードして実行したらウィルスだった!とか辛いです。
そこでファイルの配布側は改変、改ざんされていない”ファイルのハッシュ値”を前もって公開しておく事で、ユーザーのダウンロードしたファイルが”本物かチェック”できるようにしてくれているわけです、優しい世界。
と、言うわけで簡単に確認できる方法をメモしておきます。
ハッシュ値の役割
インストーラーやファイルをダウンロードする時、MD5やSHA256とか表示されているのを見た事が有ると思います、配布されているファイルはダウンロード時に破損したり、悪意のある攻撃者によって改変、改ざんされている場合があるのでファイルの提供者は正しいファイルのハッシュ値を表示してくれている場合が有ります。
例えばこのようにラズベリーパイの公式で配布されているOSイメージではSHA256を表示しています。
このハッシュ値の計算方法は”MD5″や”SHA256″というような決められたルールで計算されているのでルールに従えば必ず同じ数値になるわけです。
もし、内容に変更があった場合は違う数字になるので”同じ内容ではない”と分かります。
例
ルール:あ=1、い=2、う=3、~ん=46 のように数字に置き換えて足し算するよ
かめねこ = 74
内容を変更して、同じルールで計算してみます。
かめぬこ = 73
一文字でも変わると違う数字になるので、内容が変更されたと分かるわけですね。
まあ正確な情報がこれっぽっちも含まれていない気がしますが、要は”内容が変更されたら数字が変わる“って事です。
他には大きなデータの整合性を確認する時にも便利なんでしょう、多分。
それではファイルのハッシュ値を調べてみましょう。
ハッシュ値を調べる方法
やっと本題です、Macにはハッシュの計算をするコマンドがいくつか有ります、md5コマンドやshasumコマンドですね。
今回はopensslコマンドを使う方法を備忘録としてメモします。かめねこ記録
opensslコマンドはオプションを与える事で色々と出来ますが、詳しい内容はgoogle先生に聞くとして、とりあえずターミナルを起動します。
ターミナルはMacのSpotlightやLaunchpadで”ターミナル”と入力すると起動できます。
そして下のコマンドを入力してターン!とreturnを押す、これだけです。
openssl [オプション] [ファイルパス]
使用できるハッシュ関数[オプション]
これでハッシュ値を調べることが出来ます、さっそく比較してみようと思います。
ハッシュ値を計算して出力する
サンプル画像のハッシュはそれぞれ以下のようになっています
サンプル(hash-checksum-img1.png)
MD5
dab9d79a3384515e0bf457565dc4e60c
SHA1
95deaf6f90243e063d2ac346ed17394313a791b8
SHA256
eaf2e550918530ac6e8a40e776122928cb827078247fdb7319f908f2071627f7
サンプル画像をデスクトップにダウンロードして確認してみます。
openssl md5 ~/Desktop/hash-checksum-img1.png
結果
MD5(hash-checksum-img1.png)= dab9d79a3384515e0bf457565dc4e60c
一緒ですね、試しに黒のドットを追加したサンプル2画像のハッシュ値を確認してみます。
サンプル2(hash-checksum-img2.png)
openssl md5 ~/Desktop/hash-checksum-img2.png
結果
MD5(hash-checksum-img2.png)= ab8b831c7e31717da65ae742b2d974f4
違いますね、そりゃ違う、これが一緒ならびっくりします。
そんな事よりも比較するのが面倒ですね、すごく面倒。
これだと比較するにしても面倒すぎる、そこでハッシュ値をクリップボードにコピーして一緒に出力してしまいましょう。
比較するために同時に出力
ハッシュ値だけを表示した方が良いのでawkでハッシュを取り出してきました、ついでにクリップボードもechoで表示。
下のコマンドをターミナルに入力して、比較したいmd5のハッシュ値をコピーします。
openssl md5 ~/Desktop/hash-checksum-img1.png | awk '{print $2}' ; pbpaste ; echo
正常なハッシュ値→dab9d79a3384515e0bf457565dc4e60c
コピー、そして実行。ターン!
少し楽になりましたが、md5とかsha256とかオプションを忘れてしまいそう、それにファイルパスの入力も面倒だなと。
コピペで簡単にしたいのでちょっと変更して遊んでみます。
対話的にハッシュを表示する
ハッシュ値のオプションを対話的に入力を促す事でオプションを忘れてしまうことに対応した結果、このようになりました。
サンプル画像
MD5
dab9d79a3384515e0bf457565dc4e60c
SHA1
95deaf6f90243e063d2ac346ed17394313a791b8
SHA256
eaf2e550918530ac6e8a40e776122928cb827078247fdb7319f908f2071627f7
下のコマンドをターミナルに入力して実行します、今回はSHA1にしましょう。
あとはエンター押すくらいです、オプションはsha1とかsha256って表示されているので入力するだけですね。
read -p 'Fileをドラッグしてエンター=> : ' filename && read -p "比較するハッシュ値をコピーしてエンター: " && read -p 'sha1 sha256 またはmd5 ? => : ' hash && echo $(pbpaste) && openssl $hash $filename | awk '{print $2}'
おしまい
無理やり対話的に持っていったのでスマートではないですがこれで解決とします。
どうせなら比較して”一致”とか”違うよ!”とかやるべきだと思うけど、解決とします。
ここまで書いておけばopensslを忘れることはないでしょう、いやー忘れてしまいそうだな。かめねこ
追記
忘れてしまいそうだったので自作コマンドとして残すことにしました。
詳しくはコチラの記事に書きました。
自作コマンドにしてしまえばより一層忘れることがなくなるはず!
コメント