【问题标题】:Any reason not to use bcrypt on email addresses?有什么理由不在电子邮件地址上使用 bcrypt?
【发布时间】:2016-04-21 20:53:59
【问题描述】:

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

$email_hash = password_hash($email, PASSWORD_DEFAULT);

我知道它是用于密码的,但那又怎样?也应该在电子邮件上工作......如果使用电子邮件登录,它不应该像密码一样被散列/加盐吗?我知道这不是标准做法,但一直不明白为什么。

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

【问题讨论】:

  • 没有理由不这样做,节省成本。如果有人入侵了您的数据库,他们将无法获取电子邮件地址 - 您也不会。所以,如果你需要用户的电子邮件地址来做其他事情,你会被淹没。
  • 电子邮件用于交流。如果您对所有用户的电子邮件地址进行哈希处理,您将如何通过网站新闻/更新/密码重置等联系他们?没必要。如果您担心您的数据库被劫持,只需确保您的软件是最新的,并使用大量其他基于安全的措施来防止这种情况发生。
  • 您需要用户名(电子邮件地址)才能登录。如果您使用password_hash 对用户名进行哈希处理,您每次都会得到不同的值,所以唯一的查找用户记录的方法是尝试每个哈希值,看看是否匹配。
  • @Arjan 提供的理由是最好的理由。
  • @Arjan 显而易见的解决方案是使用password_verify() 作为电子邮件地址。

标签: php security login bcrypt


【解决方案1】:

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

通常你会这样做:

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 在哈希中包含盐。

来自wikipedia

例如,[bcrypt hash] $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy 指定成本参数为 10,表示 210 轮密钥扩展。盐是 N9qo8uLOickgx2ZMRZoMye,生成的哈希是 IjZAgcfl7p92ldGxad68LJZdL17lhWy。

或来自PHP docs

请注意,password_hash() 将算法、成本和盐作为返回哈希的一部分返回。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数验证哈希,而无需单独存储盐或算法信息。

【讨论】:

  • 顺便说一句,这是一个 PHP 问题,您给出了一个 Node.js 答案。 :)
  • 我想我现在已经正确地 PHP 化了这个伪代码。
  • 但是您也可以使用password_verify($email, $emailHash) 作为电子邮件地址,不是吗?
  • 您可以,但是您必须遍历数据库中的所有用户才能这样做,因为您无法知道要使用哪个 $emailHash。
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多