【问题标题】:bcrypt hash both email address and passwordbcrypt 对电子邮件地址和密码进行哈希处理
【发布时间】:2014-10-26 18:46:57
【问题描述】:

我正在建立一个匿名网站。因此,基本上用户的帐户无法追溯到任何真实的人(例如通过电子邮件地址)。身份验证是我希望您考虑的部分。如果我使用电子邮件/密码组合进行身份验证,我可以使用 bcrypt 对电子邮件地址和密码进行哈希处理(我知道这是可能的,但它是否实用)?我想如果电子邮件是加密的,那么搜索数据库以找到匹配项会非常慢。这是真的/假的吗?你觉得呢?你有没有什么想法?还有其他想法吗?基本上,我对如何进行身份验证的任何想法持开放态度,但如果它是通过电子邮件进行身份验证的,那么它就不能被公开/或解密。谢谢!

【问题讨论】:

    标签: authentication passwords bcrypt


    【解决方案1】:

    一旦你对某些东西进行哈希处理,就永远无法恢复原件。

    我们以密码为例,通常当用户使用电子邮件/密码注册时,您将对密码进行哈希处理(使用 bcrypt 之类的东西),然后将哈希存储在您的数据库中。这很好,因为如果攻击者获得了数据库的副本,就无法“解密”哈希。

    在您的情况下,您可能不想散列电子邮件,因为这意味着您永远无法向该人发送电子邮件——我假设您会想要这样做。

    如果您决定走这条路,您基本上只需为每个用户存储两个密码(这是我能想到的最接近的类比,抱歉!)。

    希望有帮助!

    编辑:更好的方法是创建一个只给定密码的新帐户,然后自动为该人生成一个用户名。这就是像 privateinternetaccess.com 这样的公司所做的——他们会为你生成一些随机用户名——这样你就无法联系到用户,但他们仍然可以安全地登录到你的应用程序。

    【讨论】:

      【解决方案2】:

      我认为您的想法没有任何问题(假设您永远不想异步向用户发送电子邮件)。

      登录:

      1. 用户发布了一个包含明文电子邮件和明文密码的登录表单(当然你使用了良好的 TLS 传输加密)
      2. eh = h(电子邮件),ph = h(密码)
      3. 从用户数据库中获取 eh == stored_eh 的记录
      4. 比较 ph 和 stored_ph

      忘记密码程序:在用户使用他的明文电子邮件地址发布“忘记密码”表单的那一刻,您就有了他的电子邮件。计算呃,查找配置文件,生成一次性令牌,将其存储到配置文件中并将其放入邮件中发送到他的电子邮件地址。然后他可以使用令牌来定义新密码。

      更改电子邮件程序:与上述类似,您在发布表单时拥有明文旧/新电子邮件地址。

      注意事项:

      • 第 3 步中的数据库查找并不比使用明​​文搜索键慢
      • 对于 2 和 4,使用维护良好的库中的一些健全的代码(scrypt、bcrypt、pbkdf2、sha512_crypt,而不仅仅是简单的盐渍哈希)
      • 如果攻击者获取了您的数据库并拥有潜在电子邮件地址列表,他可以轻松找出您是否拥有(其中一些)他们作为用户,并确定他们在您的数据库中的用户记录。如果这是一个问题,您也许可以使用 h(email+password),但这样就无法恢复密码。

      【讨论】:

      • 所以你基本上是在说:1)如果我对电子邮件和通过(分别)进行加密,它不会减慢身份验证查找过程,并且 2)如果我对两者都进行加密(单独)并且用户忘记了他们的密码我仍然可以匹配一个帐户(因为电子邮件是单独散列的)并使用最近输入的电子邮件进行恢复以通过电子邮件发送密码更改令牌。如果我不存储恢复电子邮件也不存储恢复发送电子邮件的日志......那么数据库仍然无法追踪?
      • hmm,一些额外的注意事项:1)当然它会减慢计算一个更多哈希(例如bcrypt)2)用户名的时间,你希望每次哈希计算为相同的用户名提供相同的哈希,所以你不能在这里使用盐[否则你将无法从数据库中查找记录]。对于密码,你当然应该使用盐,这样两个密码相同的用户就不会有相同的哈希值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2021-06-08
      • 2013-03-28
      • 1970-01-01
      相关资源
      最近更新 更多