あるレンタル・サーバー上の MySQL をいじっていると、MySQL 上のユーザー・アカウントのパスワード・ハッシュ値の文字列長が 16文字しかないことに気付いた。あまり意識したことがなかったが、普段別のサーバー等で見慣れたハッシュ値は 41文字だ。

16文字のサーバーと 41文字のサーバー、それぞれの MySQL で PASSWORD() を実行したときの結果は、次の通り。

■ 16文字
mysql> SELECT PASSWORD('hoge');
+------------------+
| PASSWORD('hoge') |
+------------------+
| 13ae08e92ef36dd0 |
+------------------+
1 row in set (0.00 sec)
■ 41文字
mysql> SELECT PASSWORD('hoge');
+-------------------------------------------+
| PASSWORD('hoge')                          |
+-------------------------------------------+
| *4266488C892EA7950486FEC0A1CFFC1BD9543F7B |
+-------------------------------------------+
1 row in set (0.00 sec)

同じ関数の結果が違うとはどう言うわけか、と思って調べてみるとこう言うわけで、4.0 → 4.1 でパスワード・ハッシュのサイズが 16バイトから 41バイトに変更されているらしい。しかし該当サーバーはそこまで古くないし、MySQL は最初から 5.0 だったはず。起動スクリプトに --old-passwords のようなオプションは指定されていないので、なら設定ファイルかと my.cnf を眺めてみると、[mysqld] セクションに

old_password = 1

と書いてあった。

この行をコメントアウトして MySQL を再起動し、改めて PASSWORD() を実行すると、無事に 41バイトのハッシュ値が得られた。しかしこれは以後登録されるパスワードに関してで、既存ユーザーのパスワードを変換してくれるわけではない。既存の 16バイトのハッシュ値を 41バイトにするには、改めてパスワードを設定し直す必要がある。

41バイトのハッシュ値が使える状態になっていれば、ハッシュ値が 16バイトの MySQL ユーザーもそのまま認証を通るが、該当サーバーで敢えて old_password を使う理由はないはず (少なくとも僕の側には全くない)。ハッシュ値が短いままでは気持ちが悪いし、幸い MySQL ユーザーは数人しかいないので、全ユーザーのパスワードを手動で再登録した。

最初から old_password が設定されていたと言うことは、このレンタル・サーバーではこれがデフォルトのようだ。ひょっとするとホスティング会社が提供する管理ツールの絡みで old_password が必要だったのかもしれないが、使ってないからまァいいか。

Comments are closed.