PHP salt加密/解密密码

时间:2014-02-24 18:40:16

标签: php encryption login salt

我正在尝试注册并登录具有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";
}

任何人都可以指出问题所在。谢谢!

2 个答案:

答案 0 :(得分:2)

实际上你的代码应该尽我所能,尽管它非常不安全!

  1. 问题:SHA256不适合散列密码,因为它太快了。使用像BCrypt这样的慢键派生函数。
  2. 问题:只有字母的三字盐几乎没有保护。
  3. 也许您的数据库字段小于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()

(另外,你不应该试图解密密码,只能验证密码。)

如果您不熟悉这些概念,请安全地使用并使用经过验证的真实库。