なんだか htpasswd で長いパスワードを設定してもちゃんと機能していないっぽい…、いやいや Basic 認証だから短い文字列しか使えない、なんていう制約はない、のでは…?ということで調べた。結果、ドキュメントかコマンドのヘルプ表示に書いてあることがすべてだった。
まずは、おや??と思ったサーバが使っていたのが Apache 2.2 だったので、そちらのドキュメントを見てみる。
htpasswd - Manage user files for basic authentication - Apache HTTP Server Version 2.2
-m Use MD5 encryption for passwords. This is the default (since version 2.2.18).
-d Use crypt() encryption for passwords. This is not supported by the httpd server on Windows and Netware and TPF. This algorithm limits the password length to 8 characters. This algorithm is insecure by today's standards. It used to be the default algorithm until version 2.2.17.
ち、ちしきもソフトウェアも更新されていない。。。 古い httpd を使っていたので、そのまま更新してパスワードファイルを作り直し。
後述するがデフォルトになっている MD5 を利用するのがいいっぽい。
$ sudo yum update httpd
$ htpasswd -inm foo-user
ついでに Apache 2.4 を使っている別サーバの様子も確認。
htpasswd - Manage user files for basic authentication - Apache HTTP Server Version 2.4
こちらは bcrypt が使えたり SHA が insecure だよといった情報も増えている。
-m Use MD5 encryption for passwords. This is the default (since version 2.2.18).
-B Use bcrypt encryption for passwords. This is currently considered to be very secure.
-C This flag is only allowed in combination with -B (bcrypt encryption). It sets the computing time used for the bcrypt algorithm (higher is more secure but slower default: 5 valid: 4 to 17).
-d Use crypt() encryption for passwords. This is not supported by the httpd server on Windows and Netware. This algorithm limits the password length to 8 characters. This algorithm is insecure by today's standards. It used to be the default algorithm until version 2.2.17.
-s Use SHA encryption for passwords. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif). This algorithm is insecure by today's standards.
なんで SHA が insecure なのかは下の Security Considerations トピックに書いてある。 SHA を指定するとパスワードに対してソルトが設定されず毎回同じ値になるのがよろしくないとのこと。
というわけでこちらの Apache 2.4 がいるサーバでは bcrypt を使う、ついでにコストパラメータもちょっと上げてみる。
$ htpasswd -nb -C 10 bar-user
...
実際に各種作って比べるとこんな感じ。 いままでのそれよりだいぶ雰囲気がちがう。。。
$ cat htpasswd_test.sh
#!/bin/sh
password=test-foo-bar
echo 'raw'
echo $password | htpasswd -inp test
echo 'crypt()'
echo $password | htpasswd -ind test
echo 'sha'
echo $password | htpasswd -ins test
echo 'md5'
echo $password | htpasswd -inm test
echo 'bcrypt()'
echo $password | htpasswd -inB test
echo 'bcrypt() with cost=10'
echo $password | htpasswd -inB -C 10 test
$ htpasswd_test.sh
raw
Warning: storing passwords as plain text might just not work on this platform.
test:test-foo-bar
crypt()
Warning: Password truncated to 8 characters by CRYPT algorithm.
test:19KcNn65a0Ovo
sha
test:{SHA}FsxBAWUFKrRlyJof3T+q9X6QfNE=
md5
test:$apr1$/nZjVA4i$5.tcV5puEwC6t0xQzuBfK1
bcrypt()
test:$2y$05$W4354fiJgesqn4/EXJhOsemadtHoX.PevbZA76fptomx09NAvbQTa
bcrypt() with cost=10
test:$2y$10$A6DDhPBzUOQA3aRui6acK.IaRpe0bqL9m5dcER4Gp0Bwk/SzEYhNa