有什么理由不在电子邮件地址上使用 bcrypt 吗?

Any reason not to use bcrypt on email addresses?

我现在正在处理的登录表单使用用户电子邮件地址和密码进行登录。 所以我在想,有什么理由不应该在电子邮件地址上使用 bcrypt 作为:

$email_hash = password_hash($email, PASSWORD_DEFAULT);

我知道它是用于密码的,但那又怎样?应该也适用于电子邮件...如果使用电子邮件登录,它不应该像密码一样是 hashed/salted 吗?我知道这不是标准做法,但一直不明白为什么。

我不一定需要知道用户的电子邮件地址。我的意思是,我不会和他们聊天。也许当用户被禁止时我应该通过电子邮件通知他们,但为什么要首先通知不法分子。

您需要电子邮件地址来查找用户记录。

通常你会这样做:

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) 将始终 return 不同的值,因为 bcrypt 在散列中包含盐。

来自wikipedia

For example, the [bcrypt hash] a$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy specifies a cost parameter of 10, indicating 210 key expansion rounds. The salt is N9qo8uLOickgx2ZMRZoMye and the resulting hash is IjZAgcfl7p92ldGxad68LJZdL17lhWy.

或来自PHP docs

Note that password_hash() returns the algorithm, cost and salt as part of the returned hash. Therefore, all information that's needed to verify the hash is included in it. This allows the verify function to verify the hash without needing separate storage for the salt or algorithm information.