【问题标题】:Sending forgot password emails using blowfish使用河豚发送忘记密码的电子邮件
【发布时间】:2013-08-21 03:11:55
【问题描述】:

这存储在数据库中。如何将此演示密码发送给我的用户?我无法将这个 ($2y$10$Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls.) 转换为普通文本。

有什么解决办法吗?我也无法发送随机密码。

demo = $2y$10$Zjk5YzQ4ZTlhMzNlNTUzMO3Wnm1FqXmAb6/4DmyptNGoEdWGLwls.

以下是我用于密码检查和生成的一些函数:

function password_encrypt($password) {
  $hash_format = "$2y$10$";   // Tells PHP to use Blowfish with a "cost" of 10
  $salt_length = 22;                    // Blowfish salts should be 22-characters or more
  $salt = generate_salt($salt_length);
  $format_and_salt = $hash_format . $salt;
  $hash = crypt($password, $format_and_salt);
    return $hash;
}

function generate_salt($length) {
  // Not 100% unique, not 100% random, but good enough for a salt
  // MD5 returns 32 characters
  $unique_random_string = md5(uniqid(mt_rand(), true));
    // Valid characters for a salt are [a-zA-Z0-9./]
  $base64_string = base64_encode($unique_random_string);
    // But not '+' which is valid in base64 encoding
  $modified_base64_string = str_replace('+', '.', $base64_string);
    // Truncate string to the correct length
  $salt = substr($modified_base64_string, 0, $length);
    return $salt;
}

function password_check($password, $existing_hash) {
    // existing hash contains format and salt at start
  $hash = crypt($password, $existing_hash);
  if ($hash === $existing_hash) {
    return true;
  } else {
    return false;
  }
}

【问题讨论】:

  • 我看不到您要问的实际问题。 “演示密码”是什么意思?
  • 如果用户忘记了他们的密码,那么应该向他们发送一个包含随机生成的令牌的链接,该令牌(在有限的时间内,仅限一次使用)可用于获取允许新密码的表单要设置的密码。您不应该将散列密码发送给用户。
  • 您选择的哈希算法不会改变如何处理密码重置的最佳做法。

标签: php blowfish forgot-password


【解决方案1】:

生成一个新密码并发送给用户,这不是一个很好的密码恢复方案。而是向用户发送带有随机独立代码的链接,并将此代码存储在您的数据库中(散列)。当用户点击链接时,然后让他输入新密码。不需要知道旧密码,当用户可以阅读电子邮件(他的电子邮件地址)时,他就被认证了。

一个忘记密码的表格,每个人都可以发布:如果有人输入您的电子邮件并且您的密码立即被更改,您将不会高兴。检索链接后,您可以忽略电子邮件,或确认您确实要更改密码。

正如您正确指出的那样,密码应存储为哈希,因此无法检索。一旦密码的哈希值存储在数据库中,就不再需要知道真正的密码了。以后只要你需要密码,你就会知道,因为是用户输入的。

要生成 BCrypt 哈希,我建议使用 PHP 函数 password_hash(),还有一个 compatibility pack 用于早期的 PHP 版本。尤其是盐的产生,在那里得到了更好的解决。

附: 您描述的哈希称为 BCrypt,它基于用于双向加密的河豚密码。

【讨论】:

    猜你喜欢
    • 2016-08-31
    • 2011-02-19
    • 2013-06-13
    • 2015-06-22
    • 2013-03-04
    • 2012-02-29
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多