检查用户名/密码是否与用户名/加密密码匹配。旋转漩涡加密和盐

5

我刚开始学习php,并决定挑战编写注册和登录脚本。但是我不确定该如何继续。在你查看我的代码之前,请不要像那些喜欢唠叨sql注入和bobby表的人一样。我明白这些问题,但目前并没有考虑它们。

无论如何,我使用whirlpool算法和盐来加密密码。目前盐是静态的,我不确定如何使用Time()函数实现动态盐值,而不会在数据库中暴露。我正在尝试解决的问题是如何检查用户输入的用户名和哈希密码是否匹配。

这是我的当前代码,我认为最重要的部分将在login.php文件中。

<?php
//connect.php
    $connection = mysql_connect("localhost","root","") or die("Couldn't connect to database");
    mysql_select_db("test", $connection);
?>

<?php
//index.php
include 'connect.php';
define('salt','7hPqMO(m=F+!!L6(#Yhp-CdF, &Q}+cIrA;c@wcP(E--V<qRmq!v*aSnM;H=4cD0');


if(isset($_POST['username']) && isset($_POST['fullname']) && isset($_POST['email']) &&      isset($_POST['password'])) {
    $username = mysql_real_escape_string($_POST['username']);
    $fullname = mysql_real_escape_string($_POST['fullname']);
    $email = mysql_real_escape_string($_POST['email']);
    $password = mysql_real_escape_string($_POST['password']);
    $encryptedPassword = hash( 'whirlpool',salt.$password );

    $sql="INSERT INTO `users` (username, fullname, email, password)
    VALUES
    ('$username', '$fullname','$email','$encryptedPassword')";

    if(!mysql_query($sql,$connection)) {
        die('Error: ' . mysql_error());
    } else {
        mysql_close($connection);
        header('Location: login.php?redirectedFromRegister=1');
    }
}
?>

<html>
    <body>
        <form action="index.php" method="post">
            <h1>REGISTER</h1><hr/>

            Email:    <input type="text" name="email"/><br/>
            Full Name:<input type="text" name="fullname"/><br/>
            Username: <input type="text" name="username"/><br/>
            Password: <input type="password" name="password"/><br/>

            <input type="submit" value="REGISTER"/>
        </form>
    </body>
</html>

<?php 
//login.php
include 'connect.php';

if(isset($_GET['redirectedFromRegister'])==1) {
    echo 'Thank you for registering, you may now login';
} else {
    echo '<h1>LOGIN</h1>';
}
?>

<html>
    <body>
        <form action="index.php" method="post">

            Username: <input type="text" name="username"/><br/>
            Password: <input type="password" name="password"/><br/>

            <input type="submit" value="LOGIN"/>
        </form>
    </body>
</html>

这个问题可能很简单,但是我想包含我的当前代码,以便人们可以从中学习。

如果给定盐或其他信息,如何解密哈希密码。就像我说的,我不确定该怎么做。

如果您没有在connect.php文件中看到它,我的数据库信息如下:

Database : Localhost
Username : Root
Password : ""
Table    : users

Table layout :

------------------------------------------------------------------  
|  Id  |  Username  |  Password  |  Email       |  Fullname      |
------------------------------------------------------------------
|  1   |BobbyTables | HASHED_PASS|email@E.com   | Max Mastalerz  |
|  2   | SteveJo    | HASHED_PASS|steve@jobs.com| Steve Jobs     |
|  3   | MarkZuck   | HASHES_PASS|MarkZ@fb.com  | Mark Zuckerberg|
------------------------------------------------------------------

这些代码也可以在pastebin上轻松获取:
Connect.php : http://pastebin.com/8ft12kG5 Index.php : http://pastebin.com/TqrJhzdu login.php : http://pastebin.com/9fR3HJhe

你的盐值不应该对每个用户都相同。你应该随机生成它,然后将其与密码连接起来,再传递给哈希函数。然后,你需要将每个用户的盐值存储在数据库中以供以后比较。 - Alex W
你需要对用户输入的密码进行哈希处理,并将其与数据库中的密码进行比较。 - Bigalow
当你在学习的时候,顺便提一句,php中mysql已经被弃用了,请使用mysqli。这样会更加容易一点,这是更好的选择 :) 然后你可以逐渐转移到PDO上,它是最好的选择。 - David G
@bigalow 如果我要使用动态盐值,应该怎么做呢?我现在非常了解基础知识。另外,有没有什么规则不将动态盐值存储在自己的列下面? - user3483494
我不知道这样的规则,但我不是这方面的专家。您首先需要从数据库中获取该登录用户的盐。之后,您应该检查使用盐散列的输入密码是否等于存储在数据库中的密码。也许这个主题可以提供进一步的帮助:https://dev59.com/zGUq5IYBdhLWcg3wF8hQ - Bigalow
@user3483494 你可以将盐存储在自己的列中。如果黑客获取了每个用户的盐,也不是什么大问题,因为盐的作用只是防止他们使用预先计算好的彩虹表来快速破解所有用户的密码。 - Alex W
1个回答

1
盐值哈希的一般想法是生成每个用户的盐值,将其附加到密码上,并将盐值与盐值哈希密码一起存储在数据库中。
当用户登录时,您查找其用户名的盐值,将其附加到他们输入的密码上,一起进行哈希处理,并将其与存储在数据库中的哈希值进行比较。
如果您真的非常坚持要为所有用户使用单个盐值,可以将全局盐值附加到用户输入的密码上,并将其与您存储的哈希值进行比较。

我明白了!不得不读两遍才理解。有点基础,不是吗。非常感谢!另外,您建议使用什么作为随机盐?Unix时间戳,混合随机数字... 盐应该多长,是否有生成随机字母或ASCII值的函数。也许有一个随机整数函数,可以将数字转换为ASCII值。有没有想法在不将每个数字声明为变量的情况下完成这个操作。 - user3483494
取决于您使用的系统。请查看此帖子以获取一些想法:https://dev59.com/RHM_5IYBdhLWcg3w4njb 通常我会生成一堆随机字节,然后进行base64编码。这样您就可以轻松地将其存储在数据库中。 - photoionized
哦,顺带一提回答你的问题,类似Unix时间戳之类的不好,因为它不是一个好的随机源,请阅读上面的文章以了解更好的替代方案。 - photoionized
我看到的最好的是相当有趣的,random.org使用大气噪声,另一个网站使用熔岩灯。天才啊。 - user3483494

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接