そもそもチェックサムとは何か?
はじめに、チェックサムとは何かについてみていきましょう。
チェックサムとは、誤り検出符号の一つで、データ列を整数値の列とみなして和を求め、これをある定数で割った余り(余剰)を検査用データとするもの。最も単純な誤り検出方式の一種で、誤りの検出精度は低いが原理が簡単で容易に実装でき、計算コストも低いため、簡易な誤り検出方式として広く普及している。※
※出展:IT用語辞典 e-words
チェックサムは、上記のように定義されていますが、これを簡単に言い変えると、チェックサムを利用することで、ファイルの「同一性」を確認できます。
発行元が配布しているファイルがあるとして、それを自分のパソコンにダウンロードしたとします。ダウンロード後にチェックサムを確認することによって、通信の途中でファイルが改ざんされていないかを確認することができます。
チェックサムを使ってみよう
それでは、実際にチェックサムを使ってファイルの同一性を確認してみましょう。
ファイルをダウンロードする場合
まずは、公開されているファイルをダウンロードした場合のチェックサムの確認をしてみます。
チェックサムの確認方法はいろいろありますが、ここでは例としてSHA-256形式を利用します。
例えば、以下のサイトで公開されているCentos7の「CentOS-7-x86_64-Minimal-1908.iso」というISOをダウンロードしてみます。
http://ftp.riken.jp/Linux/centos/7/isos/x86_64/
理研のCentOSの配布先では、以下のURLでSHA-256形式のチェックサムが記載されていますので、ダウンロードしたISOのチェックサムを確認して、配布先と同じであるか確認してみます。
http://ftp.riken.jp/Linux/centos/7/isos/x86_64/sha256sum.txt
上記テキストファイルでは、以下のように記載されていますので、これと合っていれば大丈夫です。
9a2c47d97b9975452f7d582264e9fc16d108ed8252ac6816239a3b58cef5c53d CentOS-7-x86_64-Minimal-1908.iso
Linuxの場合
Linuxの場合、「sha256sum <ファイル名>」という形で取得できます。
[hoge@server ~]$ sha256sum CentOS-7-x86_64-Minimal-1908.iso 9a2c47d97b9975452f7d582264e9fc16d108ed8252ac6816239a3b58cef5c53d CentOS-7-x86_64-Minimal-1908.iso
同じになっている(「同一性が担保されている」)のがわかります。
Windowsの場合
Windowsの場合、コマンドプロンプトで「CertUtil -hashfile <ファイル名> SHA256」という形で取得できます。
Windowsで試しましたが、ハッシュ値の2桁ずつにスペースが入りますが、Linuxの場合と同じになっているのが分かると思います。
C:\>CertUtil -hashfile CentOS-7-x86_64-Minimal-1908.iso SHA256 SHA256 ハッシュ (ファイル CentOS-7-x86_64-Minimal-1908.iso): 9a 2c 47 d9 7b 99 75 45 2f 7d 58 22 64 e9 fc 16 d1 08 ed 82 52 ac 68 16 23 9a 3b 58 ce f5 c5 3d CertUtil: -hashfile コマンドは正常に完了しました。
このようにコマンドを実行して、チェックサムが確認できますが、もし違う値になった場合、ファイルの中身が変更や改ざんされている可能性があります。
ファイルを自分で作成する場合
SHA-256コマンドは非常に便利で、簡単に使えるため、実際に自分でファイルを作成して、チェックサムを生成してみます。
ここではLinuxを例にしていますが、Windowsでも基本的には同じです。
(1)まず、適当なファイル「test.txt」を作成します。ここでは、catコマンドでファイルの中身を確認しています。
[hoge@server ~]$ cat test.txt This is a pen.
※catコマンドについて詳しく知りたい場合はこちらを参照してください。
(2) この「test.txt」というファイルのチェックサムを確認してみます。
[hoge@server ~]$ sha256sum test.txt 151d5d7835b54d701b30f6251104e05b74543944ec44b5ce77ff8c7eb05bb7b2 test.txt
(3) 次に適当な文章をtest.txtに挿入してみます。
[hoge@server ~]$ echo "You are cool." >> test.txt [hoge@server ~]$ cat test.txt This is a pen. You are cool.
(4) ここで再度チェックサムを確認してみます。
[hoge@server ~]$ sha256sum test.txt 5b4da66f5a8da20c469c32b13a6ee946177e691d871681fcd89e4a1bcdb3325c test.txt
先ほどと違う値になりましたね。
(5) 先ほどのファイルに追加した2行目の「You are cool.」を取り除いて、test2.txtを作成してみます。
[hoge@server ~]$ cat test.txt | head -1 > test2.txt [hoge@server ~]$ cat test2.txt This is a pen.
(6) このtest2.txtのチェックサムを確認してみると。
[hoge@server ~]$ sha256sum test2.txt 151d5d7835b54d701b30f6251104e05b74543944ec44b5ce77ff8c7eb05bb7b2 test2.txt
はじめと同じになりました。
(7) 最後に、はじめのtest.txtをコピーしてtest3.txtを作成してみます。
[hoge@server ~]$ cp test.txt test3.txt [hoge@server ~]$ cat test3.txt This is a pen. You are cool.
(8) チェックサムを確認してみます。
[hoge@server ~]$ sha256sum test3.txt 5b4da66f5a8da20c469c32b13a6ee946177e691d871681fcd89e4a1bcdb3325c test3.txt
(4) で確認したときと同じチェックサムの値になりました。
このようにファイル名が異なっても、コンピューター的に中身が全く同じであれば、チェックサムの値は等しくなります。
「コンピューター的に」とあえて言っているのは、人間の目では全く同じにみえてもコンピューター的には違うことがあるからです。
次項でその例を紹介します。
チェックサムはごまかせない?!
見た目が同じようにみえてもチェックサムはごまかせないという例を紹介します。
以下の「test3.txt」「test4.txt」はcatコマンドで確認した場合、見た目が全く同じようにみえます。
[hoge@server ~]$ cat test3.txt This is a pen. You are cool. [hoge@server ~]$ cat test4.txt This is a pen. You are cool.
ただ、チェックサムを確認すると2つのファイルは異なっています。なぜでしょうか?
[hoge@server ~]$ sha256sum test3.txt 5b4da66f5a8da20c469c32b13a6ee946177e691d871681fcd89e4a1bcdb3325c test3.txt [hoge@server ~]$ sha256sum test4.txt ed4e8fa95b237766cb8e7de5bd0d84c44c92de07abdb0a6fdb327eab18e5e423 test4.txt
これは、それぞれのファイルの改行コードが異なるからです。つまに、catコマンドで確認した見た目は同じでも、コンピューターの世界ではファイルの中身が異なるということです。Windows 上で作成したファイルは、通常は改行コードを CRLF で扱いますが、Linux 上では LF という改行コードを扱います。「test4.txt 」の方はWindowsの改行コードを使っています。
内容からは少しそれますが、OSによって異なる改行コードの違いは、間違いによく陥ります。特にWindowsのメモ帳などでは確認できないため、専用のソフトを使って確認する必要があります。
ちなみに、Linuxで改行コードを確認したい場合は、catコマンドに「-v」オプションをつけるとわかります。
[hoge@server ~]$ cat -v test3.txt This is a pen. You are cool. [hoge@server ~]$ cat -v test4.txt This is a pen.^M You are cool.^M
まとめ
このように、チェックサムは、ファイルを編集・コピーしたときやダウンロードしたときの「ファイルの中身」の「同一性」を簡単に確認できます。
3.で見たように実際に目で見ても分からない違いも検出することができますので、確実にファイルの「同一性」を担保・確認したい場合は、チェックサムを用いることをおすすめします。