passwordの保存

ちょっと、釣りのサイトをリアルタイム化したいので、アカウント管理を作りたい。条件は、以下の通り、

  1. アカウント名
  2. e-mail
  3. 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のパスワードもこんな感じでやっているらしく、今のところ問題は起きてなさそう。

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)