Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

WindowsとLinuxにて再帰的にSHA256でハッシュ値を算出してみる

今回は少し毛色を変えて、SHA256でハッシュ値を求めたいと思います。



■SHA256とは?

SHA256とは、任意の長さの原文から固定長の特徴的な値を算出するハッシュ関数の1つです。
どんな長さの原文からも256bitのハッシュ値を算出することが出来る。

下記に詳しくまとまっておりますので詳細はこちらでご確認ください。
https://wa3.i-3-i.info/word15997.html

LinuxにてSHA256でハッシュ値を求めてみる

ではまずはLinuxWindowsでどのようにSHA256でハッシュ値を求めるのかをまとめます。
と言っても下記コマンドで求めることが可能です!!

sha256sum ファイル名

例えば、test.txtというファイルを作成し、

sha256sum test.txt

と実行すると、

84ced9d1657fbe5989b3e5ad77053f6d62eb478460a2cfb7acf5e39d90650322  test.txt

といった結果が得られます。

さらに、-cオプションを付与することによりハッシュ値比較も行えます。
例えば、

sha256sum test.txt > hoge.txt

と実行し、ハッシュ値hoge.txtに格納した後、

sha256sum -c hoge.txt

と実行すると、

test.txt: 完了

と出力されるかと思います。
"完了"が返ってくると成功、
"失敗"が返ってくるとハッシュ値比較結果NG、
となります。
ですので、sha256sumでハッシュ値を取得した後、test.txtを編集し、

sha256sum -c hoge.txt

を実行すると、

test.txt: 失敗
sha256sum: 警告: 1 個の計算したチェックサムが一致しませんでした

といったメッセージが出力されます。

WindowsにてSHA256でハッシュ値を求めてみる

では次にWindowsでSHA256ハッシュ値を求めてみます。
Windowsではこちらのコマンドになります。

CertUtil -hashfile ファイル名 SHA256

こちらもLinuxと同様にtest.txtで確認してみます。

CertUtil -hashfile test.txt SHA256

を実行すると、

SHA256 ハッシュ (対象 test.txt):
d0f652050ec013d2ca787a8dc8a9c785982839370e6b1e644744dcd51fe2ab7f
CertUtil: -hashfile コマンドは正常に完了しました。

のように、ハッシュ値が返ってくるかと思います。

■フォルダ内ファイルに対して再帰的にハッシュ値を算出する

LinuxWindows共にはSHA256でハッシュ値算出できるのですが、
1つ困ったことがあります。
それは、ファイル名を指定しないとハッシュ値を求めてくれない所です。
例えば、hugaフォルダを作成し、その配下にhuga2フォルダを作成し、huga2フォルダにtest.txtを移動させた場合、
要するに、

huga/huga2/test.txt

の構成に対して、

sha256sum huga/*

を実行しても、

sha256sum: huga/huga2: ディレクトリです

と出力されてしまいます。
これは、Windowsにも同様に発生します。

このため、
フォルダ内のファイル・フォルダに対して再帰的に処理を実行することが必要になる。
ということです。

LinuxWindowsのそれぞれで再帰的にSHA256を処理するためのコマンドはこちらになります。

Linux

find huga -type f -exec sha256sum -b {} \;

Windows

cd huga
for /r %i in (*) do (CertUtil -hashfile "%i" SHA256)

こちらを実行するとそれぞれ、
Linux

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *huga/huga2/test.txt

Windows

17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
CertUtil: -hashfile コマンドは正常に完了しました。

尚、SHA256のハッシュ値算出結果をテキストに書き込むには、

Linux

find huga -type f -exec sha256sum -b {} \; > hoge.txt

Windows

cd huga
for /r %i in (*) do (CertUtil -hashfile "%i") >> hoge.txt

とすればOKです。

また、LinuxでのSHA256のハッシュ値比較ですが、今回のケースでも、

sha256sum -c hoge.txt

とすればOKです。

Windowsでの注意点

CertUtil -hashfile ファイル名 SHA256

ですが、空ファイル(新規作成しただけ)に対して実行すると、

CertUtil: ファイルを格納しているボリュームが外部的に変更されたため、開かれているファイルが無効になりました。

といったエラーが返ってきてしまいます。

■最後に

今回はハッシュ値算出方法に関してまとめてみました。
ハッシュ値を求めたり、比較したりするだけであれば簡単に実行出来ることが分かったのが収穫。