.htpasswdファイルを操作する
WEBrick::HTTPAuth::Htpasswdで「.htpasswd」互換のファイルを作成したり、記録されているデータにアクセスしたりできます。
require 'webrick' # Htpasswdのインスタンスを作成。 # 引数で保存先ファイル名を指定する。 passwd = WEBrick::HTTPAuth::Htpasswd.new('./pass') # パスワードを登録。 passwd.set_passwd(nil, 'user', 'password') passwd.flush # 保存 puts IO.read( "./pass" ) # パスワードを取得。 # もともとのパスワードではなく、「crypt された文字列」が返される。 pass = passwd.get_passwd(nil, 'user', false) puts pass # ユーザー認証はこんな感じで。 # -保存されたcrypt済みパスワードと、cryptしたパスワード # を比較して同一であることをチェックする。 # -保存されたcrypt済みパスワードの先頭の2文字がsalt puts pass == "passward".crypt(pass[0..2]) # => false puts pass == "password".crypt(pass[0..2]) # => true
実行結果です。
user:eNBO0nZMf3rWM eNBO0nZMf3rWM false true
おー、これでユーザー名とパスワードを(気休めレベルかもしれないにしても)さくっと暗号化して保存できるなーと期待したけど、よくよく調べてみるとそういった用途には使えないようだ。
- 「.htpasswd」はcryptを使って暗号化したパスワードを記録している。
- cryptでの暗号化は一方向。生成された文字列から元の文字列は(攻撃的手法を除いて)復元できない。
よって、認証には使えるけど、もともとのパスワードを安全に保存したい場合には使えない。んー、残念。