【问题标题】:PHP salt encrypt/decrypt passwordPHP salt加密/解密密码
【发布时间】:2014-03-26 14:43:07
【问题描述】:

我正在尝试注册和登录具有盐加密的表单,但我并不熟悉它。所以一切正常,除了登录无法识别密码,所以我很确定这是加密问题。这些是注册行:

$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";
}

谁能指出问题。谢谢!

【问题讨论】:

    标签: php encryption login salt


    【解决方案1】:

    这有很多问题。 对于初学者:您是否使用密码存储盐?否则,密码将无法验证。

    安全注意事项:

    hash('sha256', ... 不足;考虑 bcrypt、scrypt 或 pbkdf2

    $text = md5(uniqid(rand(), true));听说过openssl_random_pseudo_bytes()吗?

    (另外,你不应该试图解密密码,只需要验证它们。)

    如果您不熟悉这些概念,请谨慎行事并使用经过验证的真实库。

    【讨论】:

      【解决方案2】:

      实际上,就我所见,您的代码应该可以正常工作,尽管它非常不安全!

      1. 问题:SHA256 不适合散列密码,因为它太快了。使用 BCrypt 等慢速密钥派生函数。
      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);
      

      【讨论】:

        猜你喜欢
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多