仁がWeb技術っぽい記事を書いています。[PHP]PocketTweetハッシュで保存されているパスワードを別なところに引き継いだり、管理画面を使わずに直接データベースに書き込むことになったりで、パスワードからハッシュを生成する必要がでてきた。RubyかPerlでやろうと思ってすこし調べてみたけどすぐには思った結果が得られなかったので試しにPHPを使ってみたらうまくいった。は$1$という文字列から始まる34文字のハッシュ値のことでパスワードの保存に利用されている。CentOSでは/etc/shadowにあるシャドウパスワードの中に下のように記載されている。MD5での認証に対応しているアプリケーションやサーバソフトであれば、実際のパスワードは分からなくても引き継げるわけだ。MD5を生成してみる。salt.php$1$K70XzH/b$cPf1qv.ZnmvLkFUkxtr5W.こんな感じに実行するたびに結果が変わる。Saltがランダムに生成されているからだ。逆にSaltを指定してあげれば値は一つに決まる。salt2.php$1$K70XzH/b$cPf1qv.ZnmvLkFUkxtr5W.今度は何度実行しても同じ結果が出力される。print(crypt($argv[1])."\n");------------------------------------------------------------------あとは、引数からパスワードを取得してハッシュを生成できるようにコマンド化してしまえばあとはどうにでもできる。hogehoge$1$/Qtgkr1S$5yxMCjWQjEznRGa/7uiB2.引数の数などエラー処理などは必要であればしてください。マニュアルによるとSaltを省略したcrypt関数の実行結果は実装によって異なるので必ずしもCRYPT_MD5になるわけではないようだ。アルゴリズムの実装によって決まるので、予期せぬ結果となることがあり得ます。私の環境ではCRYPT_MD5で利用できたのでSaltを省略したまま使っている。追記よくよく見たらPHP5.3.0移行ではシステムのcrypt(3)の実装にMD5が無い場合でもPHP自身の実装でカバーするようです。XのcryptではMD5をサポートおらず、バンドルされているPHPのバージョンが5.3系だったので利用できたということのようです。自身にもそれぞれの実装が含まれるようになりました。システム側でそのアルゴリズムがサポートされていない場合にこの実装を使用します。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。仁がWeb技術っぽい記事を書いています。