ちょっと、釣りのサイトをリアルタイム化したいので、アカウント管理を作りたい。条件は、以下の通り、
- アカウント名
- 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のパスワードもこんな感じでやっているらしく、今のところ問題は起きてなさそう。