PHP密码密码

时间:2011-11-10 14:13:50

标签: php login

网站的简单注册和登录页面。我正在尝试加密密码+ salting。这就是我所做的,但我不确定它是否正确。

这是注册页面中发生的事情:

$blowfish = '$2a$10$';
$salt = '8dF$d_3';
$hashedPass = crypt($password,$blowfish . $salt);

在数据库中,密码“RAYray99”存储为“$ 2a $ 10 $ 8dF $ d_3 $$$$$$$$$$$$$$。wxsfa7X.nkcGqldJ9fujdd8eY.H85uC”


在登录页面上,我无法检查如何使用数据库中的密码检查输入的密码。

这是验证用户的登录php脚本:

mysql_connect("$db_host", "$db_username", "$db_pass") or die(mysql_error());
//select the database or return error message
mysql_select_db("$db_name") or die("database does not exist");

$email = stripslashes($_POST['email']);
$email = strip_tags($email);
$email = mysql_real_escape_string($email);
$password = ereg_replace("[^A-Za-z0-9]", "", $_POST['password']); // filter everything but numbers and letters
$password = crypt($password);

$sql = mysql_query("SELECT * FROM members WHERE email='$email' AND password='$password' AND activateemail='1'"); 
$login_check = mysql_num_rows($sql);
if($login_check > 0){  
while($row = mysql_fetch_array($sql)){ 
    // Get member ID into a session variable
    $id = $row["id"];   
    session_register('id'); 
    $_SESSION['id'] = $id;
    // Get member username into a session variable
    $username = $row["username"];   
    session_register('username'); 
    $_SESSION['username'] = $username;
    // Update last_log_date field for this member now
    mysql_query("UPDATE members SET lastlogin=now() WHERE id='$id'"); 
    // Print success message here if all went well then exit the script
    header("location: account.php"); 
    exit();
} // close while

} else {
// Print login failure message to the user and link them back to your login page
  print '<br /><br /><font color="#FF0000">ERROR TRY AGAIN </font><br />;
  exit();
}

我的问题是如何验证登录页面上输入的登录密码,数据库中包含1。

谢谢你, 射线

5 个答案:

答案 0 :(得分:1)

要验证密码,您应该对输入的密码进行哈希处理,与首次存储时的方式完全相同。

我看到了你所拥有的一些问题。首先,crypt()的blowfish字符串根据PHP文档指定,$2a$10$之后应该是./0-9A-Za-z字母表中的22个字符的字符串。你的盐不遵循,所以哈希函数可能完全失败(虽然我不确定)。

此外,您的应用程序中的盐不应该是常量,它应该对每个用户都是唯一的,并且与它们的哈希密码一起存储在数据库中。

最后,在对其进行哈希处理之前,不应该对密码进行这些转换。打破一个以明文密码作为输入的函数,并输出散列密码。存储密码时以及尝试验证登录时都使用此功能。这样你肯定知道它应该匹配数据库。

答案 1 :(得分:0)

我正在使用mapper来进行我的SQL查询(doctrine2)。

我的密码在我的db

中使用md5 + salt保存
public function setPassword($password) {
    $this->_password = self::encodePassword ( $password );
    return $this;
}
/**
 * This function encodes the password to md5 after adding a salt
 * @param string $password
 */
public static function encodePassword($password) {
    $salt = 'dsa7893ujlksdsagkz27392kjsjaldksju928ikljda27';
    return md5 ( $password . $salt );
}

我的登录信息如下......

/**
 * Executes an authentication try
 *
 * @throws Zend_Auth_Adapter_Exception if the authentication failed
 * @return Zend_Auth_Result
 */
public function authenticate()
{
        //check if login is correct
        try{
                $user = $this->_em->getRepository('App_Model_User')
                    ->findOneBy(
                        array(
                            '_email' => $this->_login,
                            '_password' => App_Model_User::encodePassword( $this->_password )
                        )
                );
        }catch( Exception $e ){
                throw new Zend_Auth_Adapter_Exception( 'authentication failed', 0, $e );            
        }

.............

答案 2 :(得分:0)

$password = $_POST['password'];
$str = "$2a$10$8dF$d_3$$$$$$$$$$$$$$.wxsfa7X.nkcGqldJ9fujdd8eY.H85uC";

if (preg_match('/^(.{7})(.{7})(.+?)$/', $str, $m))
{
     $blowfish = $m[1];
     $salt = $m[2];
     $hashedPass = $m[3];
     $validHashedPass = crypt($password,$blowfish.$salt);

     if ($validHashedPass == $hashedPass)
     {
          good pass
     }
     else
     {
          wrong auth
     }
}

答案 3 :(得分:0)

我有一个专为此案例而建的课程。它使用sha1()散列函数和PDO预处理语句来防止SQL注入。我会尝试找到它并在此发布,但如果我不这样做,这是我对你的建议:

  • 使用散列函数,而不是加密函数。
  • 不要使用mysql_*,因为它不支持预准备语句。使用PDO或非常小的mysqli

答案 4 :(得分:-1)

正如@Brad指出的那样,散列密码而不是加密密码会更简单(并且在某种程度上更安全​​)。

MySQL无论如何都支持MD5和SHA1哈希。

走这条路线的一个好处是你可以做到:

$pass = md5($salt . $pass);
$SQL = "SELECT * FROM users WHERE username = '$user' AND pass = '$pass';";

直接在数据库上

$SQL = "SELECT * FROM users WHERE username = '$user' AND pass = MD5('{$salt}{$pass}')";