PHP、MySQLのセキュリティについてのメモ2


この前書いた『パスワードは暗号化してDBに入れる』のことですが、
これだけでは辞書攻撃、レインボーテーブルというものをされたら突破されてしまう可能性が結構あるということが分かりましたので、その対策をメモ。


まず、辞書攻撃とは?
辞書に載っている単語を片っ端から入力していくという手法。
パスワードにこの辞書に載っている単語を使っていた場合、突破されてしまう訳ですね。


これの対策としては、単純に辞書に載っていないような文字列を使うこと。
ようはランダムな文字列が一番いい。



もう一つレインボーテーブルについて。


これは、DBにパスワードとそれに対応するハッシュ値を登録しておき。
ハッシュ値を入手した場合、その値と対応するパスワードを調べるという方法。


対策は、ユーザーが入力したパスワードをDBに登録する際にパスワードの文字列にあるランダムな文字列を加えて、それを暗号化しDBに付加された文字列と共に格納しておく。


コードとしてはこんな感じ

<?php

$password = $_POST["password"];
$salt = "hogehoge";
$s_pass = sha1($password.$salt);

//$s_passと$saltをDBに格納

?>


ユーザーを認証する場合のコード

<?php

$s_pass = "DBから取り出したs_pass";
$salt = "DBから取り出したsalt";

if($s_pass == sha1($_POST["password"].$salt)){
    //認証
}else{
    //認証失敗
}

?>


とりあえず登録するパスワードは複雑で少なくとも辞書には載っていないものにするべきですね。


参考サイト
パスワードの保存に SMD5 (Salted MD5) や SSHA1を使う (MD5 への辞書攻撃とか) - まちゅダイアリー(2007-10-23)
レインボーテーブル - Wikipedia
辞書攻撃 - Wikipedia