FreeBSD メモ - OpenSSL でファイルを暗号化する

2007/06/05

OpenSSL でファイルを暗号化する方法を教えてもらったのでメモ。

これまで,他人に中身を見られるとまずいファイルは GnuPG で暗号化していたんですけれど,このツールは FreeBSD 標準のコマンド(通常 /usr/bin 以下にあるコマンド)ではなかったのでした。で,非標準のコマンドをいちいちインストールしないと,大切なファイルの中身が見られないってのも,運用としてどうなんだと,つらつら思っていたのです。

openssl(1) は FreeBSD に標準のコマンドなので,わざわざ特別なプログラムをインストールしなくても,手軽に手持ちのファイルを暗号化することができます。FreeBSD 標準の暗号化ツールというと,crypt(1) や enigma(1) なんかもあるけれど,openssl(1) の方がはるかに高機能です。

Cipher Type(暗号化のアルゴリズム)は以下の中から選ぶことができます。ここでは AES-256 で暗号化しました。

Cipher Types
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ecb               -aes-128-ofb
-aes-192-cbc               -aes-192-cfb               -aes-192-cfb1
-aes-192-cfb8              -aes-192-ecb               -aes-192-ofb
-aes-256-cbc               -aes-256-cfb               -aes-256-cfb1
-aes-256-cfb8              -aes-256-ecb               -aes-256-ofb
-aes128                    -aes192                    -aes256
-bf                        -bf-cbc                    -bf-cfb
-bf-ecb                    -bf-ofb                    -blowfish
-cast                      -cast-cbc                  -cast5-cbc
-cast5-cfb                 -cast5-ecb                 -cast5-ofb
-des                       -des-cbc                   -des-cfb
-des-cfb1                  -des-cfb8                  -des-ecb
-des-ede                   -des-ede-cbc               -des-ede-cfb
-des-ede-ofb               -des-ede3                  -des-ede3-cbc
-des-ede3-cfb              -des-ede3-ofb              -des-ofb
-des3                      -desx                      -desx-cbc
-rc2                       -rc2-40-cbc                -rc2-64-cbc
-rc2-cbc                   -rc2-cfb                   -rc2-ecb
-rc2-ofb                   -rc4                       -rc4-40
-rc5                       -rc5-cbc                   -rc5-cfb
-rc5-ecb                   -rc5-ofb

この他にも openssl(1) は MD5 や SHA を使ったメッセージダイジェストを作ることもできるし,パスワードを作るコマンドも用意されています。こんなに便利なツールがあったとは!

で,詳しい使い方といきたいところなんですけれど,こういうもんは,実際使ってみてからの方がいいと思うので,ここではそれっぽくラップしたスクリプトをだけを紹介しておきます。詳しい使い方は man してみてください。

#!/bin/sh
# encrypt/decript by OpenSSL
#
# USAGE: enc <file> [file]
#        dec <file> [file]

if [ `basename ${0}` = "dec" ]
then
    OPTION="-d"
    SUFFIX="dec"
else
    OPTION="-e"
    SUFFIX="enc"
fi

case $# in
    1)
        INFILE=${1}
        OUTFILE="${1}.${SUFFIX}"
        ;;
    2)
        INFILE=${1}
        OUTFILE=${2}
        ;;
    *)
        echo "USAGE:" `basename ${0}` "<file>" "[file]"
        exit
        ;;
esac

openssl enc ${OPTION} -aes256 -in ${INFILE} -out ${OUTFILE}

enc か dec のどちらかのファイル名で保存して,もう片方に作ったファイルへのシンボリックリンクを張って使います。それぞれ,第1引数にエンコード/デコードしたいファイルのファイル名を指定して,第2引数にはエンコード/デコード後のファイル名を指定します。第2引数を省略したときは,第1引数のファイル名に,それぞれ `.enc' または `.dec' というサフィックスが付けられて保存されます。

enc を起動すると,確認を含めて2回パスワードを求められます。適当なパスワードを付けておきましょう。dec を起動すると,デコードするためのパスワード(enc の時に使ったパスワード)を入力するように促されます。入力すると,デコードされたファイル名ができるはずです。

alias を使ってもよかったんですけど,スクリプトタイプのコマンドにしておいた方が何かと融通が利きそうなので,シェルスクリプトを使っています。単純に短縮名だけほしい向きは,最後の一行を適当に alias するのがいいんだと思います。

とりあえず,手元では,ウェブサービスのアカウントなんかをメモったテキストファイルなんかを収めておきました。こういうのって,あまり電子化しておきたくないんですけど,紙をほっぽらかして人に見られてたら同じだな……というわけで……。デコードしたファイルは,使い終ったらちゃんと消しておかなきゃいけませんね。

Site Navigation
SNS Accounts (@aian)

普段はここら辺に住んでいます.