任何理由不在电子邮件地址上使用bcrypt


Any reason not to use bcrypt on email addresses?

我现在正在处理的登录表单使用用户电子邮件地址和密码登录。所以我在想,有什么理由为什么我不想在电子邮件地址上使用 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() 返回算法、成本和盐作为返回哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数验证哈希,而无需单独存储盐或算法信息。

相关文章: