检查用户名/密码是否与用户名/加密密码匹配。惠而浦加密和盐

时间:2014-04-08 02:44:17

标签: php mysql whirlpool

我刚开始学习php,并决定让自己接受编码注册和登录脚本的挑战。

我不确定如何继续。现在,在你搜索我的代码之前......请不要成为关于sql注入和bobby表的漫步者。我明白了,但目前还没有看到它。

无论如何,我用漩涡和盐加密了密码。目前salt是静态的,不确定如何使用Time()函数实现一个,而不是通过将其定位在数据库中来破坏目的。我想解决的问题是如何检查用户是否输入了与用户名和 HASHED 密码匹配的用户名和密码。

这是我目前的代码,我假设最重要的部分将在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

1 个答案:

答案 0 :(得分:1)

盐腌哈希的一般想法是,您生成每用户盐,将其附加到密码并将盐与盐渍+哈希密码一起存储在数据库中。

当用户登录时,查找salt以查找其用户名,将其附加到他们输入的密码,将其一起散列并将其与存储在数据库中的散列进行比较。

如果您真的非常坚持为所有用户提供单一盐,您只需将全局盐附加到用户输入的密码,并将其与您已存储的哈希值进行比较。