bcrypt哈希电子邮件地址和密码

时间:2014-10-26 18:46:57

标签: authentication passwords bcrypt

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

2 个答案:

答案 0 :(得分:1)

一旦你对某些内容进行哈希处理,原始内容就无法恢复。

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

在您的情况下,您可能不想散列电子邮件,因为这意味着您将永远无法通过电子邮件发送此人 - 我假设您不想这样做。

如果你决定走那条路,你基本上只是每个用户存储两个密码(这是我能想到的最接近的类比,对不起!)。

希望有所帮助!

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

答案 1 :(得分:1)

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

登录:

  1. 用户发布一个包含明文电子邮件和明文密码的登录表单(当然您使用了良好的TLS传输加密)
  2. eh = h(电子邮件),ph = h(密码)
  3. 从用户数据库中获取记录,其中eh == stored_eh
  4. 将ph与stored_ph进行比较
  5. 忘记密码程序:在用户发布"忘记密码的时刻#34;用他明确的电子邮件地址表格,你有他的电子邮件。计算eh,查找配置文件,生成一次性令牌,将其存储到配置文件中并将其放入邮件到他的电子邮件地址。然后他可以使用令牌来定义新密码。

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

    注意:

    • 步骤3中的数据库查找并不比使用明​​文搜索键慢
    • for 2 and 4,使用维护良好的库中的一些理智代码(scrypt,bcrypt,pbkdf2,sha512_crypt,而不仅仅是一个简单的盐渍哈希)
    • 如果攻击者获取了您的数据库并且有可能的电子邮件地址列表,他可以很容易地找出您是否有(部分)他们作为用户并确定他们在您的数据库中的用户记录。如果这是一个问题,你可以使用h(电子邮件+密码),但是没有密码恢复。