代码之家  ›  专栏  ›  技术社区  ›  Ty Bailey

通过sha1加盐密码验证用户登录

  •  4
  • Ty Bailey  · 技术社区  · 13 年前

    我有一个非常简单的登录/用户注册脚本,它使用sha1和salt存储密码。我的密码和用户创建工作正常,并将所有内容存储在数据库中,但当我尝试使用凭据登录时,它不起作用。在搜索这个话题时,我似乎找不到任何东西。

    这是我的添加用户表单:

    session_start();
    include("includes/resume.config.php");
    
    // make sure form fields have a value and strip them
    function check_input($data, $problem='')
    {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    if ($problem && strlen($data) == 0)
    {
        die($problem);
    }
        return $data;
    }
    
    // get form values, escape them and apply the check_input function
    $name = $link->real_escape_string(check_input($_POST['name'], "Please enter a name!"));
    $email = $link->real_escape_string(check_input($_POST['email'], "Please enter an email!"));
    $password = $link->real_escape_string(check_input($_POST['password'], "Please enter a password!"));
    
    // generate a random salt for converting passwords into MD5
    $salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
    $saltedPW =  $password . $salt;
    $hashedPW = sha1($saltedPW);
    
    mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
    // select the db
    mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));
    
     // our sql query
    $sql = "INSERT INTO admins (name, email, password, salt) VALUES ('$name', '$email', '$hashedPW', '$salt');";
    
    //save the updated information to the database          
    mysqli_query($link, $sql) or die("Error in Query: " . mysqli_error($link));
    
    if (!mysqli_error($link)) 
    {
        header("Location: file_insert.php");
    }   
    

    这是我的登录脚本: 这是不起作用的

    function check_input($data, $problem='')
    {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    if ($problem && strlen($data) == 0)
    {
        die($problem);
    }
        return $data;
    }
    
    if(isset($_POST['submitLogin'])) { //form submitted?
    
    // get form values, escape them and apply the check_input function
    $name = $link->real_escape_string(check_input($_POST['name'], "Please enter a name!"));
    $password = $link->real_escape_string(check_input($_POST['password'], "Please enter a password!"));
    
    $saltQuery = $link->query('SELECT salt FROM admins WHERE name = "'.$name.'"');
    
    $salt = mysqli_fetch_assoc($saltQuery);
    $saltedPW =  $password . $salt;
    $hashedPW = sha1($saltedPW);
    
    mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
    // select the db
    mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));
    
    $validate_user = $link->query('SELECT id, name, password FROM admins WHERE name = "'.$name.'" AND password = "'.$hashedPW.'"');
    
    if ($validate_user->num_rows == 1) {
        $row = $validate_user->fetch_assoc();
        $_SESSION['id'] = $row['id'];
        $_SESSION['loggedin'] = TRUE;
        Header('Location: file_insert.php');
    } else {
        print "<center><p style='margin-top: 200px; font-weight: bold;'>Invalid Login Information</p>";
        print "<a href='admin-login.php'>Click here</a> to return to the login page.</center>";
    }
    }
    
    2 回复  |  直到 13 年前
        1
  •  3
  •   drew010    13 年前

    可能还有更多的事情要做,但它不起作用的一个原因是 mysqli_fetch_assoc 返回一个数组,并且您像字符串一样使用它。

    当您调用时,PHP会抱怨数组到字符串的转换 $password . $salt 因为此时 $salt 是一个数组。结果是你得到了这个词 Array 附加到密码中,从而导致错误的哈希。如果你有 display_errors 关闭和/或 error_reporting 设置为隐藏通知 php.ini 那么你就看不到这条消息了。

    如果您更改:

    $saltedPW =  $password . $salt;
    

    收件人:

    $saltedPW =  $password . $salt['salt'];
    

    那么它应该起作用。

    此外,你应该逃离 $盐 在将其插入数据库之前,因为它可能包含null、不可打印或单/双引号,因为它是随机生成的。

        2
  •  0
  •   SIFE    13 年前

    你没有说你是否收到任何错误消息,但从你发布的消息来看,我认为这是连接问题:

    if(isset($_POST['submitLogin'])) { //form submitted?
    
    // Here, you didn't connect to database, but you are expecting to fetch salt!
    $saltQuery = $link->query('SELECT salt FROM admins WHERE name = "'.$name.'"');
    
    $salt = mysqli_fetch_assoc($saltQuery);
    

    所以,您可能必须首先连接到数据库:

    if(isset($_POST['submitLogin'])) { //form submitted?
    
    mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
    // select the db
    mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));
    
    // Here, you didn't connect to database, but you are expecting to fetch salt!
    $saltQuery = $link->query('SELECT salt FROM admins WHERE name = "'.$name.'"');
    

    其次,mysqli_fetch_assoc返回一个数组,该数组的关键字名称是您在SELECT查询中嵌入的字段的名称,最后的代码应该是这样的:

    if(isset($_POST['submitLogin'])) { //form submitted?
    
    mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
    // select the db
    mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));
    
    // Here, you didn't connect to database, but you are expecting to fetch salt!
    $saltQuery = $link->query('SELECT salt FROM admins WHERE name = "'.$name.'"');
    $salt = mysqli_fetch_assoc($saltQuery);
    $saltedPW =  $password . $salt["salt"];
    $hashedPW = sha1($saltedPW);