这存储在数据库中。如何将此演示密码发送给我的用户?我无法将此($ 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;
}
}
答案 0 :(得分:0)
密码恢复不是一个好方案,可以生成新密码并将其发送给用户。而是向用户发送带有随机独立代码的链接,并将此代码存储在数据库中(散列)。当用户单击该链接时,让他输入新密码。然后,不需要知道旧密码,当用户可以阅读电子邮件(他的电子邮件地址)时,用户被认证。
每个人都可以发布一个忘记的密码表单:如果有人输入您的电子邮件,您的密码会立即更改,您将不会感到高兴。检索该链接,您可以忽略该电子邮件,或确认您确实要更改密码。
正如您正确指出的那样,密码应存储为哈希值,因此无法检索。一旦密码的哈希值存储在数据库中,就不再需要知道真实的密码了。无论何时您需要密码,您都会知道,因为用户输入了密码。
要生成BCrypt哈希,我建议使用PHP函数password_hash(),对于早期的PHP版本,还存在compatibility pack。特别是盐的生成在那里得到了更好的解决。
P.S。 您描述的哈希称为BCrypt,它基于用于双向加密的blowfish密码。