php哈希密码检查无法正常工作

时间:2015-02-14 13:22:55

标签: php hash passwords saltedhash

我在使用散列密码时遇到了一个奇怪的问题。我在这个网站上运行另一台服务器(linux运行php)上的另一个网站使用相同的脚本(Windows运行php)。 登录无法正常工作,存储的哈希密码与输入的密码不匹配,我已经回复检查,他们只是没有。 正如我所看到的那样,代码(两者都相同)适用于Linux而不适用于Windows,这可能吗?

这里是代码(在两个网站上都是一样的,所以不应该是问题)



<?PHP



// get user data
$strUsername = isset($_POST['email']) ? trim(strip_tags($_POST['email'])) : null;
$strPassword = isset($_POST['password']) ? trim(strip_tags($_POST['password'])) : null;

$DBH = new PDO('database details...');

$SQL = "SELECT inj_user_email,inj_user_password,inj_user_password_salt,inj_user_id FROM inj_user WHERE inj_user_email = :username;";

if ( $strUsername == '' || $strPassword = '' )
{
	$missing = 'Please enter an email address and password';
}
else
{
	$STH = $DBH->prepare($SQL);
	$STH->bindParam(':username', $strUsername);
	$STH->execute();
	$row = $STH->fetch();
	if ($STH->rowCount() > 0) {
			$verify_password = hash('sha512' , $strPassword.$row['inj_user_password_salt']);
			echo $verify_password.'<br>'.$row['inj_user_password'];
			if (strcmp($verify_password , $row['inj_user_password']) == 0) 
			{
				session_start();
				session_regenerate_id(true);
				$_SESSION['user1'] = $row['inj_user_id'];
				header('Location: ../screen/');
			}
			else
			{
				$missing='Incorrect password';
				echo $missing;
	exit;
			}
	}
	else
	{
		$missing ='Email address not found';
	}
}
header('Location: ../?missing='.$missing);
?>
&#13;
&#13;
&#13;

谢谢。

1 个答案:

答案 0 :(得分:0)

您在比较中遗漏了=个符号:

if ( $strUsername == '' || $strPassword = '' )

应该是

if ( $strUsername == '' || $strPassword == '' )

此外,该方案使用盐:

$row['inj_user_password_salt']

在散列之前附加到密码。它来自数据库,因此首先要确保正确检索盐并匹配原始数据。

然后检查您使用的字符编码是否与原始字符匹配,特别是如果您使用的是非ascii字符。 PHP上最流行的两种非ascii字符编码是UTF-8(无BOM)和ISO-8859-1。

无论如何,你不应该使用sha进行散列(甚至512位版本)

有密码散列的安全算法,例如bcrypt。

PHP&gt; = 5.5实现安全密码散列/检查功能password_hashpassword_verify。这就是你应该使用的东西。

(阅读PHP手册上的FAQ on password hashing了解更多信息)

还有密码散列库,例如phpass(由流行的CMS使用,如WordPress和Drupal)。

(如果您有兴趣,可以查看我自己的tweak,以便为此库添加对更安全的密码哈希算法的支持)