密码重置没有数据库表的电子邮件

jpa*_*kal 7 security reset forgot-password

通过邮件重置用户密码的正常流程如下:

  1. 生成随机字符串并将其存储在数据库表中
  2. 电子邮件字符串给用户
  3. 用户单击包含字符串的链接
  4. 字符串根据数据库进行验证; 如果匹配,则重置用户的pw

但是,维护一个表并使旧字符串等过期似乎有点不必要的麻烦.这种替代方法有任何明显的缺陷吗?

  1. 生成用户现有密码的MD5哈希值
  2. 将哈希字符串发送给用户
  3. 用户单击包含字符串的链接
  4. 通过再次散列现有pw来验证字符串; 如果匹配,则重置用户的pw

请注意,用户的密码已经以散列和盐渍形式存储,我只是再次对其进行哈希处理,以获得唯一但可重复的字符串.

是的,有一个明显的"缺陷":这样生成的重置链接在用户更改密码(点击链接)之前不会过期.我真的不明白为什么这会成为一个问题 - 如果邮箱被泄露,用户无论如何都会被搞砸.并且没有重复使用的风险,因为一旦用户的密码更改,重置链接将不再匹配.

Ale*_*lli 8

要解决这个问题obvious flaw,请添加当前日期(以及更多与时间相关的信息,表示即使一天中的当前分数太长),也可以添加到您要生成神秘字符串的内容并检查它 - 这使得字符串"到期"(如果您想要更长的"到期日期",您可以检查上一个以及当前日期或分数).所以在我看来你的方案是非常可行的.

  • @Longpoke,如果(例如)字符串应该在`2010/05/06&`和`2010/05/07'上有效,你将`2010/05/05'添加到你正在散列的字符串中 - 这是它.在检查时,你通过附加今天和昨天的ISO格式检查你得到的哈希 - 就是这样,几乎不是火箭科学.如果您想要比特殊字符串到期目的更好的粒度,那么您还可以使用相应的_fraction of day_ - 例如,如果您希望字符串持续约1.5天,请使用"半天"(例如AM或PM)在您正在散列的内容中(并检查3种可能性) - 也不难! (2认同)