ジャンル不定の日記です。

ファイルの暗号化について勉強した

最近メインストレージの破損が何度か起きているんだが、
手元のデータファイルはバックアップストレージから復元できているが、バックアップストレージも同時に壊れてサルベージもできなかったらマジヤバイ。
特に、自作プログラム群のソースコードが完全消失したら致命傷すぎる。
万が一に備えて、オンラインストレージを使ったバックアップを導入しようかと思ってる。
だが、オンラインストレージに重要ファイルを置くなら暗号化したいね。

というわけで、導入に向けて勉強した。


今はローカルの重要ディレクトリをシェルスクリプトで tar.gz に圧縮して、たまに手動でバックアップストレージにコピーしてるんだが、
オンラインストレージに移す時じゃなくて、tarするときに暗号化しちゃいたいかな。
って感じ。

tarコマンドで圧縮するときは普通、
$ tar czf test.tar.gz dir
ってな感じだが、tarのオプションは、
c = 書庫ファイル作成
z = gzip圧縮
f = 出力ファイル
で、fオプションを指定した場合は続けて出力ファイルを指定して、
最後に書庫に追加するパスを渡す。

というわけだが、tarで書庫を作成する際に f オプションを指定しない場合はリダイレクトやパイプで出力できるみたい。
$ tar czf test.tar.gz dir
と、
$ tar cz dir > test.tar.gz
これは同じ結果になり、リダイレクトで出力先を指定できる。
リダイレクトではなくパイプ出力もできた。
リダイレクトもパイプも無ければ標準出力になりそうだが、バイナリ出力だからだと思うが、それはエラーだった。


tarコマンドでfオプションを指定しなければパイプ出力ができることがわかったので、パイプで暗号化コマンドに渡して暗号ファイルにする。
暗号化は openssl コマンドが簡単そうだったので、それにした。

opensslコマンドは、最初の引数がサブコマンドで、暗号の種類とかを指定する。
いろいろ種類があるが、aes-128-cbc を使うことにした。
$ openssl aes-128-cbc -e -in test.tar.gz -out test.enc -pass pass:0000
こんな感じで -in の test.tar.gz を暗号化して -out の test.enc に出力できる。
-e = 暗号化する
-in = 入力ファイル
-out = 出力ファイル
-pass = 複合用パスワード
パスワードはオプションで直接渡す以外にファイルや標準入力から渡すこともできるので、直接渡す場合は "pass:パスワード" って形式になる。

ファイルを暗号化するのではなく tarコマンド からのリダイレクトを暗号化してファイルにしようと思っているわけだが、
tar cz dir | openssl aes-128-cbc -e -out test.enc -pass pass:0000
こんな感じで、-in オプションを省けばパイプで受け取った標準入力を暗号化するようになる。


test.enc が出来上がるわけだが、
openssl aes-128-cbc -d -in test.enc -out test.tar.gz
今度は暗号化の -e オプションの代わりに、復号の -d オプションを指定すれば複合して -out の test.tar.gz が出来上がる。
-pass オプションを指定することもできると思うが、省略すれば入力を求められる。


こんな感じで、問題なくシェルスクリプトでできそうですね。