一部の機能にアクセスするためにユーザー認証が必要な Web サイトを作成しています。現在、ユーザーがアカウントを作成する方法と、セッションを利用してログインを承認する方法に取り組んでいます。ユーザー情報は、user という名前の MySQL テーブルに保存されます。これには、ユーザー名とパスワードの参照が含まれている可能性があります。
セキュリティのためのパスワードハッシュ/ソルトについて読んでいて、私がまだ言語の新人であることを考慮して、何人かのPHPマスターの意見を求めていました。
私は次のスクリプトを書きました:
define('SALT_LENGTH', 6);
function generateHash($plaintext, $salt==null){
if($salt == null){
$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
}
else{
$salt = substr($salt, 0, SALT_LENGTH);
}
return $salt . sha1($salt . $plaintext);
}
?>
これは、salt を使用してハッシュを生成するために含まれる関数です。
$username = $_POST['username'];
$password = generateHash($_POST['password']);
try{
$stmt = $pdo->prepare(INSERT INTO user VALUES (:username, :password, :location, :email, :name);
}catch(PDOException $e){
echo $e->getMessage();
}
$stmt->execute(array(':username'=>$username,
':password'=>$password,
':location'=>$location,
':email'=>$email,
':name'=>$name);
これは、アカウントを作成するためのスクリプトの重要な部分です
if(isset($_POST)){
//if form was submitted
$username = $_POST['username'];
$password = generateHash($_POST['password']);
session_start();
$user = 'root';
$pass = null;
$pdo = new PDO('mysql:host=localhost; dbname=divebay;', $user, $pass);
try{
$stmt = $pdo->prepare('SELECT username FROM user WHERE username = :username AND password = :password');
$stmt->execute(array(':username'=>$username,
':password'=>$password);
if($stmt->fetch(PDO::FETCH_ASSOC)){
echo 'match';
}
else{
echo 'nomatch';
}
これは、データベース内のユーザーを検索するためのログイン セッション スクリプトです。
私の主な質問は、このハッシュ/ソルトが機能するように見えるかどうかです。あるインスタンスで暗号化を作成するために使用されるハッシュ (create acct) が、別のインスタンスで作成されたハッシュでどのように機能するかについて混乱しています。さらに、私が作成しようとしているものの複雑さは、適切に展開される可能性が低い比較的単純なソフトウェア プロジェクトに適していますか?
私のスクリプトがどこで間違っているかについての他の提案も高く評価されます (私は批判が必要です)。