+++ date = "2020-03-05" tags = ["checksum"] title = "checksumで2つのファイルの同一性をチェックするツールをgolangで書いてみた" slug = "checksum" +++ 私はファイルのハッシュ値を調べるとか比較するとかをまとめてchecksumと呼んでいます。ただ、この辺の知識は調べたり、詳しかったりするわけではなく、普段なんとなく思ってる、ふわっとした理解に過ぎません。 それを前提に話をすると、webやserverに置かれたファイルというのは、改ざんされている可能性があるため、特にインストール時や実行権限を得られるディレクトリにバイナリを置く際などはファイルの同一性をチェックし、偽装されていないかなどを確認することがよくあります。また、ファイル破損などのチェックにも有効なので、通常は、ファイルをダウンロードする時などに自動チェックされることが多いと思います。ブラウザやダウンローダーもハッシュ値チェックは行っているでしょう。 通常、checksumには、`sha1sum`,`md5sum`などのコマンドを使います。 で、ファイルを比較するとか、ハッシュ値とファイルを比較するとかになると、普通は、shellscriptを書くことになると思います。 ```sh if [ "da39a3ee5e6b4b0d3255bfef95601890afd80709" = "`sha1sum ~/.bashrc |cut -d ' ' -f 1`" ];then echo ok fi #こちらは通常、サーバーからの結果や所定形式のテキストをダウンロードしてのチェックになります、つまりパイプ前を変更する必要 sha1sum ~/.zshrc ~/.bashrc |sha1sum -c --quiet ``` しかし、今回はワンバイナリで使えるchecksumツールをgolangで作ってみました。 ```sh $ go get github.com/syui/shasumgo $ shasumgo ~/.bashrc ~/.bashrc ok $ shasumgo s da39a3ee5e6b4b0d3255bfef95601890afd80709 ~/.bashrc ok ``` こんな感じで使えます。 また、shellscriptにも使いやすいようコマンド成功時の出力をなしにするオプションもつけました。成功すると出力なし。失敗するとハッシュ値が出力されます。 ```sh $ shasumgo c ~/.bashrc ~/.bashrc $ shasumgo s c da39a3ee5e6b4b0d3255bfef95601890afd80709 ~/.bashrc ``` 最近、gh-actionsを使っていると、やっぱり、go-binaryは使いやすいなーと思ったので。 もしworkflowを書くときchecksumが必要なら`go get github.com/syui/shasumgo`して`shasumgo`コマンドで処理を書くのも便利そうと思ったりしてます。 ```sh:example.sh if [ -z "`shasumgo s c da39a3ee5e6b4b0d3255bfef95601890afd80709 ~/.bashrc`" ];then echo ok fi ``` 今日は、ゲーム(小説)の続き書こうと思ってたんだけど、なぜかこれ作ってた。