ハッシュで保存されているパスワードを別なところに
引き継いだり、管理画面を使わずに直接データベースに
書き込むことになったりで、パスワードからハッシュを
生成する必要がでてきた。
RubyかPerlでやろうと思ってすこし調べてみたけど
すぐには思った結果が得られなかったので試しにPHPを
使ってみたらうまくいった。
$1$CyuakaYO$AIdRME6BPW0TGTZL/HMjh.
のように
Salted MD5 (CRYPT MD5) は$1$という文字列から
始まる34文字のハッシュ値のことでパスワードの保存に
利用されている。
CentOSでは/etc/shadowにあるシャドウパスワードの中に下のように
記載されている。
Salted MD5での認証に対応しているアプリケーションやサーバソフトで
あれば、実際のパスワードは分からなくても引き継げるわけだ。
... hoge:$1$CyuakaYO$AIdRME6BPW0TGTZL/HMjh.:14932:0:99999:7::: ...
passwordという文字列からSalted MD5を生成してみる。
vi salt.php ------------------------------------------------------------------ <?php print(crypt('password')."\n"); ------------------------------------------------------------------
$ php salt.php $1$ExHLOO8l$b25kg2zf6qOEGjYU9PxJE1 $ php salt.php $1$PEy08Z8u$uRsoZz3Uy.syZH6FvZZnO1 $ php salt.php $1$nqFfKk8g$Rov52X4VkNG1FikKQPD9u/ $ php salt.php $1$K70XzH/b$cPf1qv.ZnmvLkFUkxtr5W.
こんな感じに実行するたびに結果が変わる。
Saltがランダムに生成されているからだ。
逆にSaltを指定してあげれば値は一つに決まる。
最後の生成結果のSaltである$1$K70XzH/b$を指定してみると、
vi salt2.php ------------------------------------------------------------------ <?php print(crypt('password','$1$K70XzH/b$')."\n"); ------------------------------------------------------------------
$ php salt2.php $1$K70XzH/b$cPf1qv.ZnmvLkFUkxtr5W. $ php salt2.php $1$K70XzH/b$cPf1qv.ZnmvLkFUkxtr5W. $ php salt2.php $1$K70XzH/b$cPf1qv.ZnmvLkFUkxtr5W. $ php salt2.php $1$K70XzH/b$cPf1qv.ZnmvLkFUkxtr5W.
今度は何度実行しても同じ結果が出力される。
vi salt3.php ------------------------------------------------------------------ <?php print(crypt($argv[1])."\n"); ------------------------------------------------------------------
あとは、引数からパスワードを取得して
ハッシュを生成できるようにコマンド化
してしまえばあとはどうにでもできる。
$php salt3.php mogemoge $1$muPXtyYV$ZTIQmrUjYvCQzbcHqcNoi1 $ php salt3.php hogehoge $1$/Qtgkr1S$5yxMCjWQjEznRGa/7uiB2.
引数の数などエラー処理などは必要であればしてください。
ただ、マニュアルによるとSaltを省略したcrypt関数の実行結果は
実装によって異なるので必ずしもCRYPT_MD5になるわけではないようだ。
ハッシュのもととなる salt 文字列。省略した場合の挙動は アルゴリズムの実装によって決まるので、予期せぬ結果となることがあり得ます。
私の環境ではCRYPT_MD5で利用できたので
Saltを省略したまま使っている。
追記
よくよく見たらPHP5.3.0移行ではシステムのcrypt(3)の実装にMD5が無い場合でもPHP自身の実装でカバーするようです。また、Mac OS XのcryptではMD5をサポートおらず、バンドルされているPHPのバージョンが5.3系だったので利用できたということのようです。
PHP 5.3.0 以降、PHP 自身にもそれぞれの実装が含まれるようになりました。 システム側でそのアルゴリズムがサポートされていない場合にこの実装を使用します。
関連記事
- None Found
“Salted MD5 (CRYPT MD5) ハッシュの生成 [PHP]” への1件の返信