htpasswd alternative の旅は続かない

「anonymous は許すまじ、htpasswdして送れ、spam対策だこれは」ちぅ issue tracker を運用しとる OSS があり。

手許にないやね、htpasswd、Apache 入れてねーし、と。

代わりになるものを探そうかとも思ったが、「それを信頼するために支払うコスト」が馬鹿らしいので、素直に Apache 入れた。Fedora など Red Hat 系なら(例えば)以下:

1 me@host: ~$ sudo yum install httpd

これで apr とか周辺ツールも入る。

そうなんだけど、そしてさらに「自分で使う気はない(htpasswdを素直に使う)」けれど、やるとしたらどんなかなと興味も出てきて。

Apache ではなくて nginx の basic authentication 向けにはこんなでいいみたい:

1 import base64, getpass, hashlib, os
2 username = "higetaroh"
3 salt = os.urandom(8) # edit the length as you see fit
4 print(
5     username + ':{SSHA}' + \
6     base64.b64encode(
7         hashlib.sha1(getpass.getpass() + salt).digest() + \
8         salt))

お塩少々、が「復号可能でなくちゃならんのよ」てことだろうね、これ。

SHA1 サポートはnginx 1.0.3 以降。この情報はここより。

htpasswd のデフォルトは md5 みたいで、こんなかなぁと思った:

1 # DON'T USE THIS FOR HTPASSWD ALTERNATIVE, BECAUSE THIS IS NOT CORRECT, MAYBE.
2 import base64, getpass, hashlib, os
3 username = "higetaroh"
4 salt = os.urandom(8) # edit the length as you see fit
5 print(
6     username + ':$apr1$' + \
7     base64.b64encode(
8         hashlib.md5(getpass.getpass() + salt).digest() + \
9         salt) + ".")

のだけど、生成される文字列の長さから、違うみたい。それ以前に、base64 でもないような気がする。uuencodeにしては文字種が少ない。ちなみに uuencodeならこうね:

1 # DON'T USE THIS FOR HTPASSWD ALTERNATIVE, BECAUSE THIS IS NOT CORRECT, MAYBE.
2 import binascii, getpass, hashlib, os
3 username = "higetaroh"
4 salt = os.urandom(8) # edit the length as you see fit
5 print(
6     username + ':$apr1$' + \
7     binascii.b2a_uu(
8         hashlib.md5(getpass.getpass() + salt).digest() + \
9         salt) + ".")

うん、多分違う。

ま、いっか。本気出すなら htpasswd のソース見りゃいいだけの話で。本気出す気はないので、ここらへんにしとこっと。

なお、オンラインツールはあります。http://www.htaccesstools.com/htpasswd-generator/
「I do NOT log ANY data entered in this form.」と主張しとりますが、Google Analytics は仕掛けてあるわいな、あんど、https じゃないわいな、てことで、信じるか信じないかはあなた次第なのぞ。