バッチファイルにパスワードを書くときの悩み

ユーザの追加や、属性の変更をバッチファイルで処理したいことがある。
しかしこういった作業には、しばしばパスワードの操作が含まれる。
しかしパスワードを平文のまま扱うわけにもいかない。
パスワードの設定・変更をするコマンドが、暗号化されたパスワードも受け付けるようになっているのは、そのためだ。

たとえばLinuxにはchpasswdというコマンドがある。chpasswdは暗号化されたパスワードを受け付ける。
もしバッチファイルを覗かれても、パスワードが暗号化されていれば、まあ大丈夫と言える。

MD5からSHA512へ

ところで、こちらの記事でも触れたとおり、MD5は今そこにある危機であるからして、パスワードのハッシュ方法をSHA512に変えるOSもぼちぼち出てきた。
そういったOSにおいて、暗号化したパスワードでユーザ情報の操作をするには、とうぜんパスワードをSHA512で暗号化しなければならない。

ということで、ある文字列をSHA512暗号化する方法を示す。

パスワードの書式での暗号化

SHA512で暗号化だなんていうのは簡単なのだが、しかし、パスワードファイルで使われる形式での暗号化となると、ちょっと工夫が必要だ。

パスワードファイルの形式は以下の通り。

$<ハッシュ方式>$<salt>$<ハッシュ後のパスワード>

要するにこういう形式での出力をしてくれるコマンドなりスクリプトでなければならない。
代表的なものでは、opensslコマンド。

Opensslコマンドのつかいかた

openssl passwdという書式で使う。

$ openssl version
OpenSSL 0.9.8y 5 Feb 2013
<中略>
Usage: passwd [options] [passwords]
where options are
-crypt             standard Unix password algorithm (default)
-1                 MD5-based password algorithm
-apr1              MD5-based password algorithm, Apache variant
-salt string       use provided salt
-in file           read passwords from file
-stdin             read passwords from stdin
-noverify          never verify when reading password from terminal
-quiet             no warnings
-table             format output as table
-reverse           switch table columns

だからたとえば、MD5形式で、saltを"SALTsalt"とし、パスワードを"test"とするならば、 以下のようにする。

$ openssl passwd -1 -salt "SALTsalt" "test"
$1$SALTsalt$CEvzkj.qgOcLTyU2B5Kg3.

しかし上述のオプション一覧を見ると分かるのだが、sha512形式には対応していない。

SHA512は…いまならperlとかpython

ここまで引っ張ってナニだが、一発でSHA512ハッシュしてくれるコマンドは見つけられなかった。
Linuxのmkpasswdも新しければ対応しているようなのだがまだ一般的ではない。
そこでperl, pythonを使う。
以下のようにする。

saltを"SALTsalt"とし、パスワードを"test"とする。

perl

$ perl -e 'print crypt("test", "\$6\$SALTsalt");'
$6$SALTsalt$gH47I0mRGadJVVlIpeTxVlYw.SjkPOZ7lJoGkqOyhyeUJ7PV5QWuYpIG6D5ggew6RXLpl1eA72TpgX5pGDpr/.

python

$ python -c "import crypt, getpass, pwd; print crypt.crypt('test','\$6\$SALTsalt\$')"
$6$SALTsalt$gH47I0mRGadJVVlIpeTxVlYw.SjkPOZ7lJoGkqOyhyeUJ7PV5QWuYpIG6D5ggew6RXLpl1eA72TpgX5pGDpr/.

FreeBSDにおける実際の使いどころは以下の記事にて。

[FreeBSD] 無人でのユーザ追加

おしまい。