散列与数据库查找效率

时间:2016-08-18 16:00:21

标签: database security hash saltedhash

我打算使用哈希生成用于验证电子邮件地址的验证令牌。哈希将像这样生成:

email:username:salt

使用SHA256算法生成散列,并且为生成的每个令牌使用相同的salt。

替代的,更常用的方法是生成一次性UID,该UID存储在数据库中并充当新电子邮件地址的验证。

我的问题是:这是否有效(将处理器和磁盘利用率等考虑在内)实现生成电子邮件验证令牌的方式。

2 个答案:

答案 0 :(得分:1)

电子邮件验证令牌的全部目的是从您的安全Web服务器生成令牌,并将该令牌通过电子邮件发送给某人,以便他们可以单击包含该令牌的链接,以便您可以验证其帐户。

要记住的重要事项:

  • 最终用户无法复制令牌,否则可能是伪造的。
  • 令牌需要由您的Web服务器(理想情况下)进行加密签名,以便CLIENT知道这是一个有效的令牌。这也很重要,因为当用户将此令牌BACK发送到您的服务器时,您可以验证您的服务器是否是创建它的服务器。
  • 令牌需要过期:您应该能够过期#39;如果在一定时间内未使用此标记:24小时,3天等

出于这个原因,我不建议您采取的方法。

相反,我会使用JSON web token(这是他们的理想用例)。另一个SO question有一个不错的总结。

使用JWT可以让你:

  • 在您的网络服务器上创建令牌。
  • 设置' expirey'此令牌上的日期,因此无法在您指定的特定时间限制后使用。
  • 对您想要的令牌中的任何特定于用户的数据进行编码:通常是用户ID或类似的东西。

当用户将令牌发送回您的Web服务器时,JWT将:

  • 保证令牌是由您的服务器而不是其他人恶意生成的。
  • 保证令牌仍然有效(就时间戳而言)。
  • 保证令牌没有被篡改。
  • 让您查看以前编码的令牌数据(用户ID /等)。

我希望这有助于=)

答案 1 :(得分:1)

你正在做的事情有些安全。

我会将你的盐称为关键 - 你正在生成一个键控哈希。确保生成具有足够熵的密钥。我建议使用CSPRNG生成的128位强度。

以这种方式生成的某些键控哈希很容易受到长度扩展攻击。也就是说,如果攻击者为foo@example.com生成了验证令牌,那么他们就可以计算foo@example.com.example.org的哈希值。这是因为哈希算法的输出也背叛了它的状态。要缓解这种情况,您可以使用HMAC algorithm

您当前的方法还有一个限制,即电子邮件地址始终具有相同的令牌。如果电子邮件地址过期(例如,带有电子邮件bobs@example.org的Bob Smith)在示例组织中被解雇,他将知道下一个Bob S.在他开始为示例组织工作时将获得的验证码。这是否对您的应用程序有任何风险由您决定。为了缓解这种情况,您可以使用JWTs代替,这样您就可以将有效期限放入可以验证的令牌中。 JWT的HS256算法也使用HMAC,解决了这个问题。

使用键控哈希应该是高效的,并且没有数据库查找的存储,维护和开销。

UID是指UUID

Remember that

  

[UUID]的目的是全球唯一,而不是不可取的。

  

[UUID]旨在实现唯一性,而非安全性。

最好使用安全的熵源(比如另一个CSPRNG)动态生成128位令牌。您可能希望使用SHA-256在服务器端对这些(无盐)进行哈希处理,以防止任何数据泄漏漏洞意味着攻击者可以验证任何电子邮件地址。