ちょっと、釣りのサイトをリアルタイム化したいので、アカウント管理を作りたい。条件は、以下の通り、
- アカウント名
- password
と、まぁ、普通のアカウント管理だわな。当然ながら、ユーザー別にidを作らなきゃいけないし、passwordもそのまま平文って分けにはいかない。e-mailも暗号化して保存したいよね、当然。そんなわけで、mysql,phpで作る。
んで、どうするのかと、アカウント名は面倒なのでアルファベットと_くらいでOK。ユニークじゃなきゃならないけど、その辺は一回チェック入れれば良いだけだから問題ない。そのアカウント名と関連付けるidはMySqlの自動インクリメントに任す。
パスワードの処理だが、普通に入力されたパスワードをhashにして保存しておけば良いのかと思っていた。
<?php //登録 function registration($account , $password){ $pwd_hash = sha1($password); save($account,$pwd_hash); } //login function login($account,$password){ $pwd_hash = load($account); if($pwd_hash == sha1($password)){ return true; // OK }else{ return false;//NG } } ?>
まぁこんな感じ。ところが、このhashだとダメなんだと。レインボーテーブルってのが、ネットのどこかに有って、作られそうなhashを根こそぎテーブルにしてあるんだそうな。。なんてこったい。
で、解決策はsaltってのを使って塩加減を調整するそうな。ユーザーからの入力は単純な物が多いかもしれないけど、何文字かゴミを付けてからhash化すれば、レインボーテーブルって奴にも引っかかり難いと、そう言う事らしい。んで、さっきのを改造すると、
<?php const SALT='awSEdrFTgyHUjiKOlp'; //登録 function registration($account,$password){ $pwd_hash_s = sha1(SALT.$password); save($account,$pwd_hash_s); } //Login function login($account,$password){ $pwd_hash_s = load($account); if($pwd_hash_s == sha1(SALT.$password)){ return true; //OK }else{ return false; //NG } } ?>
ま、こんな感じ。違いはSALTをくっつけてhashを作っているところ。linuxのパスワードもこんな感じでやっているらしく、今のところ問題は起きてなさそう。