雑記

2000|01|
2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|
2007|01|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|09|11|
2009|02|03|05|06|07|08|10|11|12|
2010|01|03|04|05|06|07|08|09|10|
2011|05|06|09|10|
2012|03|07|09|12|
2013|01|02|04|05|07|08|10|11|
2014|04|05|08|10|12|
2015|01|05|
2016|09|

2003-05-21

IP変更続き

えーと,さきほどサポートから電話が来て,「やっぱり移行期間を設けることは出来ません」と言われました.電話では埒が明かないので文書で回答を送るようお願いして,とりあえず今に至ります.どうやら5月28日以降の数日間,on-sky.netのDNSが引けなくなる可能性大です.こちらでできる対処を考え中.

本日のツッコミ(全3件) [ツッコミを入れる]

- taru-k [ダイナミックDNSはなし?]

- hs [プライマリサーバを自分でやってるので,ダイナミックもくそも無いのです.レジストラ経由でwhois DB に載ってる ..]

- taru-k [なるほどそういうことか...DNSがしみて行くのを待つとしたら大変だ。さしあたりコアユーザ(一桁?)には、変更後のI..]


2009-05-21

Apacheのパスワードチェック

htpasswdで作成したMD5パスワードの検証プログラムでちょっとはまったのでメモ。

デフォルトなら簡単で、crypt()を使えば検証できる。

% htpasswd -n sakamoto
New password:
Re-type new password:
sakamoto:ZZp3anC9LpXVk
% ruby -e 'p "test".crypt("ZZp3anC9LpXVk"); p "ZZp3anC9LpXVk"'
"ZZp3anC9LpXVk"
"ZZp3anC9LpXVk"

しかし、htpasswd(1)によるとcrypt()を使ったときには8文字制限がある。

When using the crypt() algorithm, note that only the first 8 characters
of the password are used to form the password. If the supplied password
is longer, the extra characters will be silently discarded.

というわけで、出来ればMD5を使いたい。

暗号化したパスワード("test")の生成

% htpasswd -nm sakamoto
New password:
Re-type new password:
sakamoto:$apr1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2.

先ほどと同様にチェック。

% ruby -e 'p "test".crypt("$apr1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2."); p "$apr1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2."'
"$aWVSdLXZq3pQ"
"$apr1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2."

一致しない。

crypt(3)を読むと、MD5の場合は"$1$"で始まるようなので、$apr1$を$1$に変えて試してみる。

% ruby -e 'p "test".crypt("$1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2."); p "$1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2."'
"$1$3cZHwh7q$ta3WoNKmxNLqdge3970Vy."
"$1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2."

おしい(ぜんぜんおしくねぇ)。

crypt()はあきらめてApacheのソースを読むと、apr_password_validate()という関数があった。

テストプログラム

#include "apr-1/apr_strings.h"
#include "apr-1/apr_md5.h"

int main (int argc, char *argv[]) {
   apr_status_t status;

   status = apr_password_validate(argv[1], argv[2]);
   printf("%s\n", status == APR_SUCCESS ? "ok" : "ng");
}

Apache Portable Runtimeライブラリをリンクしてコンパイル。

% gcc -I/usr/local/include -L/usr/local/lib -lapr-1 -laprutil-1 htpwd_chk.c

実行結果

% ./a.out test '$apr1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2.'
ok
% ./a.out tes '$apr1$3cZHwh7q$7DDtNJF8.j6iCI3G8TSA2.'
ng

というわけで、出来ました。