我正在创建一个需要用户授权才能访问某些功能的网站。我目前正在研究用户如何创建帐户以及如何利用会话来授权他们的登录。用户信息存储在名为 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);
}
?>
这是一个用于生成带有盐的哈希的函数。
$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';
}
这是在数据库中查找用户的登录会话脚本
我的主要问题是这种散列/盐看起来会起作用吗?我对用于在一个实例中创建加密的哈希(创建帐户)如何能够与在不同实例中创建的哈希一起工作感到困惑。此外,我试图创建的内容的复杂性是否适合一个可能永远不会正确部署的相对简单的软件项目?
任何其他关于我的脚本错误的建议也将不胜感激(我需要批评)。