opensslコマンドでhtpasswdファイルを作る

以前NginxでのBASIC認証の設定方法について書きました。

その際に.htpasswdファイルをhtpasswdコマンドで作ると書いたのですが、このコマンドはApacheをインストールしていないと入っていません。

この時はMacで作ったファイルをサーバーに転送しましたが、Apacheの入っていないFreeBSDサーバーでも.htpasswdファイルを作りたいのです!

.htpasswdファイルの中身

フォーマットは単純です。1行につき1ユーザーの情報を記述します。ユーザー情報はユーザー名とハッシュ化したパスワードをコロンで区切ったもの。

user_name:hashized_password

ただのテキストファイルです。/etc/master.passwdの先頭部分ですね。ということはパスワード文字列をハッシュ化することができれば特にコマンドは不要ということで。。。

opensslでハッシュ化できる

MySQLでパスワード隠蔽したときに使ったopensslでハッシュ化できます。

openssl passwd -apr1 -salt 'salt_string' 'password'

というわけで車輪の再発明をしますよ。簡易版htpasswdコマンドです。リダイレクトを使って.htpasswdに追記しましょう。

#!/bin/sh
SALT=`env LC_CTYPE=C tr -dc "[:graph:][:upper:][:lower:][:digit:][:punct:]" </dev/urandom | tr -d '$:' | fold -w 8 | head -1`
PASS=`openssl passwd -apr1 -salt "$SALT" $2`
echo "$1:$PASS"

ユーザー名をuser、パスワードをpasswordとして実行すると次のようになります。この時、ソルトはランダムに発生させた8文字を使っているので、同じpasswordという文字列でもやり直せば結果は異なるはずです。

$ ./htpasswd.sh user password
user:$apr1$f,lkVjpa$WSgvvzO4lOLesYl.uvy9O1

ハッシュ化パスワードのフォーマット

先ほどの出力を見ればわかるように、ハッシュ化されたパスワードは$で区切られた次のような三つの情報です。

  • ハッシュ関数
  • ソルト
  • ハッシュ化されたパスワード

opensslで指定可能なハッシュ関数はMD5ベースの1またはapr1のいずれかになります。ソルトというのはパスワードの解読を困難にする目的で、元のパスワード文字列に付加される情報ですよ。

このあたりの詳細はおいおい調べるとして、とりあえず目的は達成しました。