我现在正在处理的登录表单使用用户电子邮件地址和密码登录。所以我在想,有什么理由为什么我不想在电子邮件地址上使用 bcrypt 作为:
$email_hash = password_hash($email, PASSWORD_DEFAULT);
我知道它是用于密码的,但那又怎样?也应该处理电子邮件...如果使用电子邮件登录,难道不应该像密码一样对其进行哈希处理/加盐处理吗?我知道这不是标准做法,但从来不明白为什么。
我不一定需要知道用户的电子邮件地址。我的意思是,我不会和他们聊天。也许当用户被禁止时,我应该通过电子邮件通知他们,但为什么要首先通知不法分子。
您需要电子邮件地址来查找用户记录。
通常,您会执行以下操作:
function create_account(email, password) {
var pwhash = password_hash($password, PASSWORD_BCRYPT);
// insert into users values ($email, $pwhash);
}
function login(email, password) {
// select pwhash from users where email = $email;
return password_verify($password, $pwhash); // true or false
}
password_hash($email)
将始终返回不同的值,因为 bcrypt 在哈希中包含盐。
来自维基百科:
例如,[bcrypt hash] $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy 指定成本参数 10,表示 210 个密钥扩展轮次。盐是N9qo8uLOickgx2ZMRZoMye,生成的哈希是IjZAgcfl7p92ldGxad68LJZdL17lhWy。
或者来自 PHP 文档:
请注意,password_hash() 返回算法、成本和盐作为返回哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数验证哈希,而无需单独存储盐或算法信息。