每次重置密码链接是否应该不同?

时间:2014-01-16 09:34:51

标签: security passwords

我现在采取的方法是:

  • 使用PasswordSalt
  • 使用SHA1和一些应用程序级别的盐
  • 再次哈希
  • 然后从
  • 生成重置密码链接

优点是它非常简单,我不需要创建任何新的数据库列。

缺点可能该用户的链接始终相同。

这是安全问题吗?

2 个答案:

答案 0 :(得分:1)

这似乎是一个很大的妥协,只是为了避免额外的数据库列并为您提供简单性。

您应该安全地生成一个令牌,以便在链接中使用并存储在数据库中。这样做的好处是每次都可以随机生成它,并且可以将到期数据与令牌相关联。

这样可以最大程度地降低风险,因为重置链接的使用寿命有限,而且落入坏人之手的可能性较小。

我不同意所有使用的安全问题(在@Marcus Adams's answer中),因为如果攻击者知道受害者通常可以轻易猜到这些问题(或者通常可以通过Facebook等公共信息轻松找到这些问题配置文件)。此外,它们的缺点是无法轻易更新(例如,除非您购买新的,更好的宠物,否则您最喜欢的宠物名称将保持不变 - 或者如果您制作一个,您可能会忘记它,击败对象它首先)。

答案 1 :(得分:0)

我假设您通过电子邮件发送密码重置链接,并且用户必须输入用户ID /电子邮件地址才能启动此过程。

确保每次用户重置密码时都会生成一个新的随机盐,这样就不会有任何重播攻击。

例如,如果salt没有更改,即使密码重置,密码重置链接也不会改变。如果黑客能够获得链接,即使一年后,黑客也可以重新使用该链接将密码重置为他们想要的任何内容。

通常,在单击密码重置链接后,系统会要求用户回答他们之前设置的安全问题。这有助于缓解黑客在用户获取和使用链接之前的问题。

你可以随时重置密码,即使它没有被要求,但气味,但因为这样做需要密码盐,秘密的应用级盐(真的,一把钥匙,因为它不是随机的) ,也许是一个安全问题,更不用说请求密码重置链接是微不足道的事实(只需要用户ID /电子邮件地址),它应该足够好了。

您可能会遇到一些性能问题,因为为了验证密码重置链接,您必须扫描用户表中的所有行,将散列应用于每一行,直到找到匹配的行。