登录授权,如何检查密码是否与SALT + HASH匹配 - PHP + MySQL

时间:2012-12-16 14:02:16

标签: php mysql hash login salt

我目前正在开展一个学校项目,最近我在完成登录授权方面没有取得任何进展。我正在使用HASH和SALT注册新用户。我找不到任何能让我感到满意的资源,所以我决定在这里开个账户来问我自己的问题。

这是我的注册脚本:

    $username = $_POST['username'];
    $email = $_POST['email'];
    $first = $_POST['fname'];
    $last = $_POST['lname'];
    $salt = crypt("sha512", false);
    $pass = $_POST['password'];
    $password = hash("sha512", $salt . $pass . $salt, false);

$sql = "INSERT INTO `users` (`username`, `email`, `fname`, `lname`, `salt`, `password`) VALUES ('$username', '$email', '$first', '$last', '$salt', '$password')";

然后我有一个checklogin.php脚本,它是我的索引页面上的action =“checklogin.php”,这是登录页面。这是完整的脚本:http://pastebin.com/tKrsHaFU(粘贴bin)

我的问题是如何验证访问index.php页面(登录表单)的用户与数据库中已有的用户请记住我对密码有盐和哈希。

3 个答案:

答案 0 :(得分:5)

首先:

$salt = crypt("sha512", false);

产生静态盐,即没有变化。要产生更好的一个:

$salt = uniqid(mt_rand(), true); // the paranoid use openssl_random_pseudo_bytes()

要验证记录,您的SQL将变为:

$sql="SELECT * FROM $tbl_name WHERE username='$myusername'";
$result=mysql_query($sql);
// ...
if ($count==1) {
    $row = mysql_fetch_assoc($result);
    if (hash('sha512', $row['salt'] . $_POST['mypassword'] . $row['salt']) == $row['password']) {
        // validation passed, rejoice!
    }
}

但是,您应该看一下:How do you use bcrypt for hashing passwords in PHP?

答案 1 :(得分:0)

你不用太担心!!

现在任何登录脚本背后的基本思想以及存储用户信息的数据库背后的基本思想是,我们需要最少1个值作为主键,这将唯一地标识每个用户。 现在在你的情况下,username似乎是主键。

所以你需要做的就是执行$data = mysql_query("SELECT * FROM table_name") or die(mysql_error());

此处table_name将是存储所有用户信息的表的名称。 现在$info = mysql_fetch_array( $data );会将所有用户信息放入数组中。

一个简单的var_dump($info)会列出所有用户名以及用户的其他详细信息(仅用于测试目的......你不想在用户注册时向用户显示信息:P)

只需循环遍历此数组,并将new_user提供的用户名与数组中已存在的用户名进行匹配。如果匹配,那么你可以通过说User already exists !!来阻止他。另外欢迎他到你的网站。

答案 2 :(得分:0)

请查看您是否可以阅读这篇文章。它显示了一般的设计模式。 http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_2391-PHP-login-logout-and-easy-access-control.html

如果你可以做得那么多,下一步将是模糊数据库中的密码。您可以使用php md5()对密码进行单向编码。当客户端注册并存储编码密码时,将 md5()应用于密码。将 md5()应用于客户端输入登录表单的明文密码。在SELECT查询中使用编码密码。您可以将salt字符串连接到md5()函数调用中。每次都要确保使用相同的盐。

http://php.net/manual/en/function.md5.php

最好的问候,〜雷