以下の、
OpenSSL
のopenssl dgst -r
コマンドで作成したcoreutils
フォーマットのハッシュ値(ダイジェスト、チェックサム)を検証したい。
openssl dgst -r -out sample.txt.sha256 -sha256 sample.txt
つまり、受け取った sample.txt が、上記の sample.txt.sha256 とマッチするか知りたいのです。
TL; DR (今北産業)
- チェックサムのファイルの検証には
shasum
コマンドを使います。 - 基本構文
チェックサムの基本構文
shasum -a <SHAアルゴリズム> -c <SHAチェックサムファイルのパス>
- 具体例
shasum -a 256 -c sample.txt.sha256
- オンラインで動作をみる @ paiza.IO
TS; DR
openssl
ではファイルのハッシュ値は作成できても検証はできない
openssl
では dgst
コマンドでファイルのハッシュ値/ダイジェストを算出することができ、SHA-1 より堅牢な SHA-2(SHA-256 や SHA-512 など)のアルゴリズムも使えます。
- dgst | openssl | Docs @ OpenSSL.org
この時、openssl dgst -r
、つまり -r
オプションを付けると coreutils
フォーマットで出力できるため、従来の sha1sum
コマンドのようにファイルのチェックサムとして利用できます。
問題は、このチェックサム(ダイジェスト値/ハッシュ値)を検証するコマンドが openssl
にはないことです。
openssl dgst -verify
で検証できそうな気がするのですが、意外にできません。
なぜなら、-veryfy
オプションはハッシュ値(ダイジェスト値)の検証ではなく、公開鍵による署名の検証コマンドだからです。これは、OpenSSL は元々 SSL(Secure Sockets Layer)通信の暗号化のためのライブラリだったので、データの暗号化や署名を主としているため、-sign
オプションで署名したファイルを -verify
で検証するために使われます。
ファイルの署名ではなく、ファイルのチェックサムを比較して検証したい場合は shaXXXsum
系のコマンドを使います。
sha1sum
のように sha256sum
や sha512sum
などもありますが、汎用の shasum
コマンドがシンプルでおすすめです。
🐒 ハッシュ値/ダイジェスト値/チェックサムの違いは、以下の記事の「ハッシュ関数の基本と特徴」の項目をご覧ください。
shasum
の基本構文
shasum -a <SHAアルゴリズム> -c <SHAチェックサムファイルのパス>
-
<SHAアルゴリズム>
:1
,224
,256
,384
,512
,512224
,512256
-
<SHAチェックサムファイルのパス>
:ファイル内に1行1ファイルで複数ファイルを指定することもできる。 - 留意事項
- 比較する際のダイジェスト・ファイルのフォーマットは
CoreUtils
互換であること。- 形式が
<ハッシュ値> <ファイル名もしくはファイルのパス>
- 形式が
- ハッシュ作成時の
openssl dgst
に-r
オプションを付けるとCoreUtils
互換のフォーマットになる。 -
openssl
のverify
サブ・コマンドは署名の検証用。ダイジェスト(ハッシュ値)の検証用ではない。 - ハッシュ値による検証は「
verify
」(証明)ではなく「compare
」(比較)もしくは「check
」(確認)と覚える。
- 比較する際のダイジェスト・ファイルのフォーマットは
$ # サンプルファイルの作成
$ touch sample.txt
$
$ # SHA256 のハッシュファイル作成
$ openssl dgst -r -out sample.txt.sha256 -sha256 sample.txt
$
$ # 中身のチェック(`-r` オプションで出力フォーマットが変わることに注意)
$ cat sample.txt.sha256
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *sample.txt
$
$ # 比較検証(コンペア)
$ shasum -a 256 -c sample.txt.sha256
sample.txt: OK
- オンラインで動作をみる @ paiza.IO
動作検証済み環境
- macOS HighSierra(OSX 10.13.6)
-
$ openssl version
: LibreSSL 2.2.7 -
$ shasum --version
: 5.84