PHP

2013-05-11, php

crypt関数の検証

1方向ハッシュを生成してくれる便利な関数cryptですが、その動作を確認してみるために、以下のようなプログラムを作ってみました。公式のドキュメントがどうも読み難くて…。

test_crypt.php
<?php
$str1 = "";
for($i = 0;$i < 10;$i++){
  $str1 .= $i;
  $str2 = crypt($str1,$argv[1]);
  echo $str2 . " from " . $str1 . "\n";
}

まずは$salt(2番目の引数)を指定しなかった場合です。ドキュメントを流し読みすると「DES」が使われそうな気がするんですが、実は「MD5」が使われる事が分かります(よく読むと、そう書いてあるんですが…)。

$ php test_crypt.php ""
$1$PDOguGId$MlSKRoYt1/2nacNEoN3WO0 from 0
$1$jb44eT/Q$zpHLDAKPm7MWMG99FHW.J1 from 01
$1$Hxdn6tR6$8KRrs2FkzLbQdcZjNuauC1 from 012
$1$qgxZbpuh$feeIwnXXvy5hSOU8X1N68/ from 0123
$1$ab3Lrgq5$CIoikRCJQ4t9ekpcEEaah. from 01234
$1$rlHbofN0$g6SRN1MphHs8JFPdt.OBc0 from 012345
$1$z3LuKgXK$LwcQ4tR8O.ZL5WTH8ohqp0 from 0123456
$1$bPiNN4XS$Yin4cBSRKrs/qe2TTRD/50 from 01234567
$1$PQOQoYX7$F9aZtjOG5VA6rG6t.arF21 from 012345678
$1$LMqVBb4Q$XWV8OAPJXmkemz00iFPiM1 from 0123456789

つぎは$saltに2文字を指定した場合です。今度は「DES」が採用されています。そして注目すべきは下3行です。8文字目以降は使用されていないことが分かります。これではちょっとパスワードの管理などには使えなさそうです。

$ php test_crypt.php aa
aa5R74aRom6qA from 0
aaSWjIrIAGk6M from 01
aa9Azz8QW8uTk from 012
aaLXxiCncAXzk from 0123
aaggX/6gVKqs2 from 01234
aaWQWSL/YWLNA from 012345
aafBglZ2elrjk from 0123456
aa4c4gpuvCkSE from 01234567
aa4c4gpuvCkSE from 012345678
aa4c4gpuvCkSE from 0123456789

今回使用したPHPのバージョンは以下の通りです。OSはCentOS6です。

$ php -v
PHP 5.3.3 (cli) (built: Jul 3 2012 16:53:21)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

参考URL

この記事は役に立ちましたか?