Infra Engineer

ハッシュ値に関するコマンド
2022.09.30
Lv1

ハッシュ値に関するコマンド

 

この記事を読んでほしいひと

LPIC level1習得を目ざす、初学者のかたへ。
コマンドの基本的な使い方について、解説をします。


今回の内容

今回は、ハッシュ値に関するコマンドについて解説します。
そもそも「ハッシュ値ってなに?」という説明から、具体的にハッシュ値を求めてみるコマンドまで解説していきます。ハッシュ値はセキュリティにつながる内容であり、セキュリティリテラシーを高めることにもつながるので、ぜひ読んでみてください。

・ハッシュ値とは
・ハッシュ値を出力するコマンド
・まとめ
・確認問題

ハッシュ値とは

ハッシュ値とは、あるデータとあるデータが改ざん、破損していないかを確認するさいに用いられる値のことです。たとえばWebサイトからデータをダウンロードしたさい、ダウンロードによってデータが破損していないかをチェックするために用いられます。このハッシュ値を求めるさいに使われるのがハッシュ関数とよばれるものであり、次の特徴をもちます。
①データが異なると、求められるハッシュ値も異なります。
②データが同じだと、求められるハッシュ値は同じになります。
③ハッシュ値から元のデータには復元できません。
①の性質によりデータが破損していないかなどをチェックすることができます。②の性質によりデータが正しくダウンロードできたかなどをチェックすることができます。データ同士をチェックするのではなく、データをハッシュ関数に代入してハッシュ値を求め、ハッシュ値を比較することに注意してください。


ハッシュ値を出力するコマンド

それでは実際にハッシュ値を求めてみましょう。ハッシュ値を出力するコマンドには、ハッシュ関数MD5を用いる「md5sum」や、ハッシュ関数SHAを用いる「sha1sum」「sha256sum」「sha512sum」などがあります。今回は「md5sum」を用いてハッシュ値を求めてみましょう。まずsak1.txtに対してhogeと出力しておきます。そしてこのsak1.txtに対してハッシュ値を求めます。

md5sumの書式
 md5sum  <ファイル名>
[root@localhost Documents]# echo hoge > sak1.txt  #hogeをsak1.txtに出力する
[root@localhost Documents]# cat sak1.txt
hoge
[root@localhost Documents]# md5sum sak1.txt #ハッシュ関数MD5を用いてハッシュ値を計算する
c59548c3c567228486a1f0037eb16a1b sak1.txt

「hoge」をMD5関数に代入すると、ハッシュ値として「c59548c3c567228486a1f0037eb16a1b」が出力されることがわかりました。y=f(x)のイメージで考えると、xに「hoge」と代入したらyは「c59548c3c567228486a1f0037eb16a1b」という値が求められた、と想像してみてください。つぎにsak2.txtにもsak1.txtと同じくhogeと出力し、ハッシュ値を求めてみましょう。

[root@localhost Documents]# echo hoge > sak2.txt #hogeをsak2.txtに出力する
[root@localhost Documents]# md5sum sak2.txt #ハッシュ関数MD5を用いてハッシュ値を計算する
c59548c3c567228486a1f0037eb16a1b sak2.txt

sak1.txtとsak2.txtには同じ「hoge」というデータが書き込まれており、同じデータからは同じハッシュ値が得られることが確認できました。「ハッシュ値とは」で述べたハッシュ関数の性質のうち②が確かめられたと思います。今度はsak3.txtに対してfugafugaと出力し、ハッシュ値を求めてみます。

[root@localhost Documents]# echo fugafuga > sak3.txt #hogeをsak3.txtに出力する
[root@localhost Documents]# md5sum sak3.txt #ハッシュ関数MD5を用いてハッシュ値を計算する
01820b5d3304e76e67253c8f7a1c8397 sak3.txt

sak1.txtとsak3.txtには異なるデータが与えられていますが、異なるデータからは異なるハッシュ値が得られることが確認できました。「ハッシュ値とは」で述べたハッシュ関数の性質のうち①が確かめられました。
ここで「hoge」のハッシュ値「c59548c3c567228486a1f0037eb16a1b」と「fugafuga」のハッシュ値「01820b5d3304e76e67253c8f7a1c8397」に着目してみてください「hoge」と「fugafuga」は異なる大きさのデータですが、ハッシュ値は同じ32文字であることがわかります。このMD5などのハッシュ関数の特徴として、④データのサイズが異なっても、ハッシュ値のサイズは固定、という点があげられます。MD5だと32文字の128ビットのハッシュ値が生成されることになります。

(……ここまで読まれた方お疲れさまです。次に話す内容は少し発展的な内容を含むことになります。今までの内容ちょっと難しいなぁ…と感じられた方は確認問題に挑戦してみてください。そして次読むときにぜひ読んでみてください。もちろん初めて読む方でも分かりやすいように書いてあります。では続きをはじめましょう!)

こんどはオプションを使用してハッシュ値が同じか違うかを比べることにより、ファイルの改ざんを検知してみたいと思います(といってもファイルの改ざんを行うのは自分自身ですけどね)。sak1.txt、sak2.txt、sak3.txtのそれぞれのハッシュ値を求めたファイルを用意します。これをcheck.txtとします。いずれかのテキストファイルを変更した場合、このcheck.txtに保存してあるハッシュ値と異なるため、改ざんが検出される仕組みとなります。今回はsak2.txtの内容に変更を加えてみたいと思います。

md5sumの書式
 md5sum  <オプション>  <ファイル名>
オプション 説明
-c ファイルからMD5チェックサムを読み込み、照合する
[root@localhost Documents]# md5sum sak1.txt sak2.txt sak3.txt > check.txt #sak1.txt、sak2.txt、sak3.txtのハッシュ値をcheck.txtに出力(保存)する
[root@localhost Documents]# cat check.txt #check.txtに各ファイルのハッシュ値が出力されていることを確認する
c59548c3c567228486a1f0037eb16a1b sak1.txt
c59548c3c567228486a1f0037eb16a1b sak2.txt
01820b5d3304e76e67253c8f7a1c8397 sak3.txt
[root@localhost Documents]# md5sum -c check #各ファイルのハッシュ値と保存してあるハッシュ値の比較をおこなう
sak1.txt: OK
sak2.txt: OK
sak3.txt: OK
[root@localhost Documents]# echo hogehoge > sak2.txt #sak2.txtに対してhogehogeと出力する
[root@localhost Documents]# md5sum -c check #各ファイルのハッシュ値と保存してあるハッシュ値の比較をおこなう
sak1.txt: OK
sak2.txt: FAILED
sak3.txt: OK
md5sum: WARNING: 1 computed checksum did NOT match

sak2.txtのデータの中身を変更したため、md5sumによるチェックでFAILEDが表示されるようになりました。改めて確認しますが、もとのデータである「hoge」と変更後のデータである「hogehoge」を比較するのではなく、「hoge」から求められるハッシュ値と「hogehoge」から求めらるハッシュ値を比較していることに注意してください。

(…というわけで以上難しい内容が終了しました! このハッシュ値は保存したパスワードの照合などにも用いられる技術です。ぜひハッシュ関数とハッシュ値になれてくださいね!)

ハッシュに関するコマンドのまとめ
ハッシュ値とは、ハッシュ関数によって求められる数値のことである。
ハッシュ関数にはMD5やSHA256などがあり、オプションを使用することでハッシュ値を比較することができる。

まとめ

今回は、ハッシュ値に関するコマンドについて解説しました。ハッシュ値を出力するコマンドは、今回紹介した「md5sum」以外にもありますので、ぜひそれぞれのコマンドも確認してみてください。
最後に確認問題で、今回の記事の知識を復習してみましょう。


確認問題

問題

次の選択肢のなかで、データの同一性を確認するためのコマンドはどれか。2つ選びなさい。
①sha ②sha256sum ③md5 ④md5sum

解答
答え:②、④
①の「SHA」はハッシュ関数を表し、③の「MD5」もハッシュ関数を表している。それぞれに対応したハッシュ値を求めるコマンドは、「sha256sum」、「md5sum」と名前が違う点に注意すること。