2014-04-22 25 views
0

我看到了类似的问题在这里,但我不认为答案适用于我,我如果他们这样做对不起..注册及登录密码哈希方法相同,但没有工作

继承人的代码的sniplet含有程序:

注:登录和注册工作完全没有散列元素。

if (isset($_POST['username']) && ($_POST['password'])) { 
    $username = trim($_POST['username']); 
    $username = strtolower($username); 
    $password = trim($_POST['password']); 
    $salt = hash('md5', "$username"); 
    $password = hash('sha256', "$password"."$salt"); 

    $stmt = $dbh->prepare("SELECT `id` FROM `1_users` WHERE username=? AND password=? LIMIT 1"); 
    $stmt->bindValue(1, $username, PDO::PARAM_STR); 
    $stmt->bindValue(2, $password, PDO::PARAM_STR); 
    $stmt->execute(); 
    if ($stmt->rowCount()) { 
     // Match 
     $results = $stmt->fetch(PDO::FETCH_ASSOC); 
     $_SESSION['id'] = $results['id']; 
     $_SESSION['logged_in'] = true; 
     $_SESSION['ip'] = hash('sha1', "{$_SERVER['REMOTE_ADDR']}"); 
     header ("location: account.php"); 
    } 
    else { 
     $error = 'Invalid username/password!'; 
    } 
} 

if (isset($_POST['register'])) { 
    // check for all fields.. 
    if ((empty($_POST['r_username'])) || (empty($_POST['r_password'])) || (empty($_POST['re_password'])) || (empty($_POST['email']))) { 
     $r_error = 'One of the fields was empty.'; 
    } 

    $stmt = $dbh->prepare("SELECT `username` FROM `1_members` WHERE `username`=? LIMIT 1"); 
    $username = strtolower($_POST['r_username']); 
    $username = trim($username); 
    $stmt->bindValue(1, $username, PDO::PARAM_STR); 
    $stmt->execute(); 
    $row = $stmt->rowCount(); 
    if ($row) { 
     $r_error = 'that username is already in use'; 
    } 
    else if (($_POST['r_password']) !== ($_POST['re_password'])) { 
     $r_error = 'The passwords did not match.'; 
    } 
    else if (strlen($_POST['r_username']) <= '3') { 
     $r_error = 'username too short - needs to be 4 more charicters.'; 
    } 
    else if (strlen($_POST['r_password']) <='5'){ 
     $r_error = 'password not long enough, please make it 6-255 charicters or more.'; 
    } 
    else { 
     // woohoo lets make the account 
     $password = trim($_POST['r_password']); 
     $salt = hash('md5', "$username"); 
     $password = hash('sha256', "$password"."$salt"); 
     $email = trim($_POST['email']); 

     $stmt = $dbh->prepare("INSERT INTO `1_members` (`username`, `password`, `email`) VALUES(?,?,?)"); 
     $stmt->bindValue(1,$username,PDO::PARAM_STR); 
     $stmt->bindValue(2,$password,PDO::PARAM_STR); 
     $stmt->bindValue(3,$email,PDO::PARAM_STR); 
     $stmt->execute(); 
     $_SESSION['id'] = $dbh->lastInsertId(); 
     $_SESSION['logged_in'] = true; 
     $_SESSION['ip'] = hash('sha1', "{$_SERVER['REMOTE_ADDR']}"); 

     if ($_SESSION['active_cart']) { 
      header ("location: cart.php"); 
     } 
     else { 
      header ("location: account.php"); 
     } 
    } 
} 

之前添加散列的口令,它充当正常,即时通讯对我的问题是什么不清楚。

调试:

username: admin1 password: admin1


登录过程将打开密码:927364bb72cee168bd52c45a5d131b5923e2926eb6e8f0f46d6d7e5765cc3401

注册过程创建密码为: 927364bb72cee168bd52c45a5d131b5923e2926eb6e8f0f46d6d7e5765cc3401

它们匹配这样出了什么问题?

此外,如果我在这里得到了错误的想法,或者如果我忽略了重要的安全措施,可以请您提供更好的方法建议。

而且,我不太担心电子邮件验证,我充分意识到有大量预制snipplets可供验证的电子邮件,我会在以后的日子会越来越这一点。

任何CC都比欢迎。

编辑:该脚本返回“无效的用户名/密码组合”。

+1

你不使用任何特殊的理由['password_hash()'](http://docs.php.net/manual /en/function.password-hash.php)? –

+0

@SecondRikudo我没有意识到这一点,是什么让它比哈希更特别? – user3147145

+0

它使用bcrypt并且更安全。它也非常容易使用(它为你生成盐,并有另一个函数'password_verify()'无痛地验证密码) –

回答

1

我怀疑,对于散列密码的数据库字段太小,本场必须能够存储64个字符。

即使你能解决这个问题,你有不安全的方式来存储密码(SHA256是如何太快散列密码)。看看PHP函数password_hash(),它会生成一个BCrypt哈希,并负责生成一个安全的盐。盐将成为所得到的62个字符串的一部分,因此不需要单独存储盐。对于较老的PHP版本,还有一个compatibility pack

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

这也意味着你不能在SQL语句中直接验证密码,而不是从数据库中读取(通过用户名)的哈希值,然后调用password_verify()与此哈希。