3

我目前正在做一个学校项目,最近在完成登录授权方面没有任何进展。我正在使用 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(粘贴箱)

我的问题是如何验证进入 index.php 页面(登录表单)的用户以及已经在数据库中的用户,记住我在密码上有盐和哈希。

4

3 回答 3

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!
    }
}

但是,您应该看这里:如何在 PHP 中使用 bcrypt 对密码进行哈希处理?

于 2012-12-16T14:39:15.197 回答
0

你不必担心这么多!

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

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

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

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

只需遍历此数组并将 new_user 提供的用户名与数组中已存在的用户名匹配即可。如果匹配,那么您可以通过说 来阻止他User already exists !!。否则欢迎他访问您的网站。

于 2012-12-16T14:25:30.450 回答
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 查询中使用编码密码。您可以将盐字符串连接到 md5() 函数调用中。只要确保每次都使用相同的盐。

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

最好的问候,~雷

于 2012-12-16T14:31:35.827 回答