2012-09-21 86 views
-1

我创建了一个页面,它生成一个40个字符的盐,然后获取输入的密码并使用此PHP代码创建一个哈希,并将salt和哈希密码插入到数据库中只是相关行):PHP盐和哈希密码不匹配

$hashedpassword = sha1($password . $salt); 

然后在登录过程中,我用的是输入的密码,并从数据库中检索盐打造具有使用的代码(再次同一直线上,这只是有关线):

$hashedpassword = sha1($storedPassword . $storedSalt); 

但它不符合散列密码存储,所以要看看是否有错误,我“遥相呼应”的信息,所以我可以阅读发生了什么事:

$storedSalt = $row_rsSaltLookup['salt']; 
$storedPassword = $row_rsSaltLookup['password']; 
$storedHashedPassword = $row_rsSaltLookup['hashedpassword']; 
    //use the stored salt to hash the user's submitted password 
$hashedpassword = sha1($storedPassword . $storedSalt); 
echo "Salt: " . $storedSalt . "<br/>"; 
echo "Stored Password: " . $storedPassword . "<br/>"; 
echo "Stored Hashed Password: " . $storedHashedPassword . "<br/>"; 
echo "Pre-hash: " . $storedPassword . $storedSalt . "<br/>"; 
echo "Hashed Password: " . $hashedpassword . "<br/>"; 
echo "re-Hashed Password: " . sha1($storedPassword . $storedSalt) . "<br/>"; 
echo "re-Hashed Password 2: " . sha1($storedPassword . $storedSalt) . "<br/>"; 
if($storedHashedPassword != $hashedpassword) { 
    echo "NO MATCH"; 
}else{ 
    echo "MATCH"; 
} 
exit(); 

而且我得到这个结果:

Salt: 4039505cc4efae2 
Stored Password: ujwiervdhyf 
Stored Hashed Password: aa27c197dfd88cd2f0d46b84d259016a15bd3954 
Pre-hash: ujwiervdhyf4039505cc4efae2 
Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1 
re-Hashed Password: b06193ed26617c449902ac813376cf0c33bec3d1 
re-Hashed Password 2: b06193ed26617c449902ac813376cf0c33bec3d1 
NO MATCH 

在这个例子中,生成“盐”并将其与创建和散列帐户时的密码(存储密码)放在一起(存储散列密码)。 当我登录时,我从数据库中获取salt并将其添加到登录密码中,然后对其进行散列并将其与存储的散列密码进行比较,该密码应该是相同的? 所以我想知道我错在哪里,因为我似乎无法弄清楚为什么哈希不匹配。

+1

也许[你应该使用bcrypt用于存储密码(http://phpmaster.com/why-you-should-use-bcrypt-to-hash-stored-passwords/) –

+1

所以你'存储明文密码**和**相同密码的哈希值?你的思维过程很难遵循。 – Crontab

+0

错误,你存储了哪个哈希?你也错过了将它放入调试输出。请注意MySQL在列大小太小的情况下会自动截断数据。 – hakre

回答

2

如果

$hashedpassword = sha1($storedPassword . $storedSalt); 
         ^^^^^^^^^^^^^^^ 

是第一次创建帐户时所存储的散列,那么你这样做是不对的。你在散列哈希,这是行不通的。它应该是

$hash_of_attempted_password = sha1($password_from_login_form . $storedSalt); 
if ($hash_of_attemped_password == $hash_of_original_password) { 
    ... it's a match ... 
} 
+0

第一个散列是使用表单中的密码和生成的salt值创建的。盐和原始密码以及散列的密码将被存储(纯文本字段将在稍后移除)。我比较登录页面上的密码+存储的salt和散列,以便将其与存储的散列进行比较。这正是我在教程中阅读的内容。我会检查一下我的逻辑,以确保这正是我正在做的。 – stephmoreland