2020-03-05 / @syui

checksum

checksumで2つのファイルの同一性をチェックするツールをgolangで書いてみた

私はファイルのハッシュ値を調べるとか比較するとかをまとめてchecksumと呼んでいます。ただ、この辺の知識は調べたり、詳しかったりするわけではなく、普段なんとなく思ってる、ふわっとした理解に過ぎません。

それを前提に話をすると、webやserverに置かれたファイルというのは、改ざんされている可能性があるため、特にインストール時や実行権限を得られるディレクトリにバイナリを置く際などはファイルの同一性をチェックし、偽装されていないかなどを確認することがよくあります。また、ファイル破損などのチェックにも有効なので、通常は、ファイルをダウンロードする時などに自動チェックされることが多いと思います。ブラウザやダウンローダーもハッシュ値チェックは行っているでしょう。

通常、checksumには、sha1sum,md5sumなどのコマンドを使います。

で、ファイルを比較するとか、ハッシュ値とファイルを比較するとかになると、普通は、shellscriptを書くことになると思います。

if [ "da39a3ee5e6b4b0d3255bfef95601890afd80709" = "`sha1sum ~/.bashrc |cut -d ' ' -f 1`" ];then 
	echo ok
fi

#こちらは通常、サーバーからの結果や所定形式のテキストをダウンロードしてのチェックになります、つまりパイプ前を変更する必要
sha1sum ~/.zshrc ~/.bashrc |sha1sum -c --quiet

しかし、今回はワンバイナリで使えるchecksumツールをgolangで作ってみました。

$ go get github.com/syui/shasumgo

$ shasumgo ~/.bashrc ~/.bashrc
ok
$ shasumgo s da39a3ee5e6b4b0d3255bfef95601890afd80709 ~/.bashrc
ok

こんな感じで使えます。

また、shellscriptにも使いやすいようコマンド成功時の出力をなしにするオプションもつけました。成功すると出力なし。失敗するとハッシュ値が出力されます。

$ shasumgo c ~/.bashrc ~/.bashrc
$ shasumgo s c da39a3ee5e6b4b0d3255bfef95601890afd80709 ~/.bashrc

最近、gh-actionsを使っていると、やっぱり、go-binaryは使いやすいなーと思ったので。

もしworkflowを書くときchecksumが必要ならgo get github.com/syui/shasumgoしてshasumgoコマンドで処理を書くのも便利そうと思ったりしてます。

if [ -z "`shasumgo s c da39a3ee5e6b4b0d3255bfef95601890afd80709 ~/.bashrc`" ];then
	echo ok
fi

今日は、ゲーム(小説)の続き書こうと思ってたんだけど、なぜかこれ作ってた。