网站的简单注册和登录页面。我正在尝试加密密码+ 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。
谢谢你, 射线
答案 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}')";