我打算使用哈希生成用于验证电子邮件地址的验证令牌。哈希将像这样生成:
email:username:salt
使用SHA256算法生成散列,并且为生成的每个令牌使用相同的salt。
替代的,更常用的方法是生成一次性UID,该UID存储在数据库中并充当新电子邮件地址的验证。
我的问题是:这是否有效(将处理器和磁盘利用率等考虑在内)实现生成电子邮件验证令牌的方式。
答案 0 :(得分:1)
电子邮件验证令牌的全部目的是从您的安全Web服务器生成令牌,并将该令牌通过电子邮件发送给某人,以便他们可以单击包含该令牌的链接,以便您可以验证其帐户。
要记住的重要事项:
出于这个原因,我不建议您采取的方法。
相反,我会使用JSON web token(这是他们的理想用例)。另一个SO question有一个不错的总结。
使用JWT可以让你:
当用户将令牌发送回您的Web服务器时,JWT将:
我希望这有助于=)
答案 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?
[UUID]的目的是全球唯一,而不是不可取的。
和
[UUID]旨在实现唯一性,而非安全性。
最好使用安全的熵源(比如另一个CSPRNG)动态生成128位令牌。您可能希望使用SHA-256在服务器端对这些(无盐)进行哈希处理,以防止任何数据泄漏漏洞意味着攻击者可以验证任何电子邮件地址。