3

This question may be a little abstract, but I was wondering what the best/standard method for implementing password recovery is. I am trying to implement it in my code right now but the method I'm starting to use seems a little roundabout / confusing and I wanted to know what the "Rails way" to do this is. Any suggestions?

4

1 回答 1

6

密码通常应该被散列(最好使用盐)而不是加密,这样它们就不能被解密。然后,稍后,为了检查用户输入的密码是否正确,您可以使用他们输入的任何内容并使用相同的盐和哈希函数,并查看它是否与您在数据库中的哈希值匹配。

以这种方式存储,密码无法恢复。恢复丢失密码的标准方法是:

  1. Bob 输入他的电子邮件地址(或用户名或其他)以表明他是谁
  2. 生成“密码重置令牌”,通常是一长串字母和数字,并以某种方式存储在与 Bob 关联的数据库中。
  3. Bob 收到一封电子邮件,其中包含以某种方式附加的密码重置令牌,通常在 URL 中(例如,http://fakesite.com/reset_password?token=long_token_generated_in_step_2.
  4. 当 Bob 访问该 URL 时,该站点会验证重置令牌是否有效,并允许 Bob 选择一个密码,然后以与他丢失的密码相同的方式对其进行加盐/散列处理。

Devise 是 Rails 的身份验证 gem,具有遵循此模式的Recoverable 策略。

一些网站应用额外的安全检查,因为电子邮件不是 100% 安全的。例如,您可能要求,要获得密码重置电子邮件,用户必须回答一个秘密问题(通常在创建他们的帐户时设置)。

于 2012-01-04T00:56:23.590 回答