Salted MD5 (CRYPT MD5) ハッシュの生成 [PHP]

Pocket

ハッシュで保存されているパスワードを別なところに
引き継いだり、管理画面を使わずに直接データベースに
書き込むことになったりで、パスワードからハッシュを
生成する必要がでてきた。

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になるわけではないようだ。

PHP: crypt – Manual

ハッシュのもととなる 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

Pocket

1 Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です