我正在尝试注册并登录具有salt加密的表单,我并不熟悉它。所以一切正常,除了登录无法识别密码所以我很确定它是加密问题。这些是注册行:
$hash = hash('sha256', $password1);
function createSalt()
{
$text = md5(uniqid(rand(), true));
return substr($text, 0, 3);
}
$salt = createSalt();
$password = hash('sha256', $salt . $hash);
这些用于登录:
$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
if($hash != $userData['password'])
{
echo "Incorrect password";
}
任何人都可以指出问题所在。谢谢!
答案 0 :(得分:2)
实际上你的代码应该尽我所能,尽管它非常不安全!
也许您的数据库字段小于64个字符,或者您正在比较不同的密码。在每种情况下,都有一种更简单,更安全的哈希密码方法,只需使用新功能password_hash()和password_verify()。早期的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);
答案 1 :(得分:0)
这有很多不妥之处。 对于初学者:您是否使用密码存储盐?如果没有,则密码变得无法验证。
安全注意事项:
hash('sha256', ...
不足;考虑bcrypt,scrypt或pbkdf2
$text = md5(uniqid(rand(), true));
听说过openssl_random_pseudo_bytes()
?
(另外,你不应该试图解密密码,只能验证密码。)
如果您不熟悉这些概念,请安全地使用并使用经过验证的真实库。