Storing a user password temporarily
我有一个用例,用户注册我的服务,然后通过电子邮件确认他们的注册。我遇到的问题是,我必须等到确认电子邮件后才能创建帐户(这是一个我无法更改的外部要求),所以我必须将密码存储在某个地方,以便可以以纯文本形式检索。
最好的方法是什么?想到的解决方案是加密并存储在redis中,直到用户进行身份验证,然后创建帐户并删除redis条目。
这是最好/最安全的方法吗?
- 为什么不能哈希+盐化密码并存储该值?如果必须向第三方提供密码,请在用户输入密码时这样做,但不要将其存储为纯文本。一旦用户通过电子邮件确认了帐户,您就可以使用密码的hashed+salt值创建他们的帐户。然后,在以后的身份验证尝试中,您只需将为密码输入的值与数据库中的哈希+盐值进行比较。
- @bsimic:关键是我试图不把他们的密码存储在任何数据库中。此外,用户可以在不经过我的情况下访问外部系统,因此他们的密码也必须在另一个系统上工作。
- 这个第三方有没有可能是OAuth服务提供商?如果是的话,你可以这样做。另一种选择是使用类似openid(openid.net)的方法,在这种方法中,您完全不必进行自己的身份验证。你可以在这里看到openid是如何工作的windley.com/archives/2006/04/how_openid.shtml
更改过程:不要预先要求密码,先进行地址验证。
注册表单只接受电子邮件地址,并在链接中将令牌发送到电子邮件地址。通常是这样的:
其中nnn是一个时间戳,在该时间戳之后,链接将变得无用,而xxx是HMAC(serversecret, email+timestamp),因此您可以进行身份验证。
通过链接,他们可以得到一个带有密码字段和任何其他详细信息的注册页面。
(奖励:如果您有忘记密码的旅程,请使用相同的过程,因此遵循该链接可获得注册页面或恢复帐户页面。)
- serversecret应该是安静强的,否则这样的URL可以被伪造,并且很容易成为密码处理中最薄弱的链接。
- 我考虑过这个问题,但我不认为要求用户在验证后输入密码是可以接受的选择。