通过邮件发送一次性密码

时间:2016-09-02 10:26:44

标签: php email passwords

对于Meyers' book而言,这可能是一个更好的问题,但我认为这也不是一个不好的问题。

我正在开发一个Web应用程序来在公司内部举行在线选举。选民可以登录应用程序,对他们最喜欢的候选人进行投票,然后退出应用程序。

所有选民都被分配了一个相当不可预测的用户名,其中包含至少4个随机整数(由php {#1}}和一个完全不可预测的密码(由php random_int()提供。

客户希望通过电子邮件发送每个选民(有时最多5,000个不同的人)的用户名和密码。我不是一个忠实的粉丝,但这对我来说是不行的。电子邮件是通过SSL发送的,至少是这样的。

我在想,由于选民只需要投票一次,我可以在投票后立即停用他们的帐户。然后使用相同的凭据再次登录将无法正常工作。此外,我可以每24小时更改一次密码,并向尚未投票的选民发送包含更新凭据的新电子邮件。选举通常持续3-5天,因此这些更新的电子邮件将自动作为投票的提示。当选举结束时,所有相关帐户也将被停用。

这足够安全吗?我已经阅读了许多文章,这些文章会促使您使用一次性URI与令牌,但我的应用中创建的帐户只能登录一次,之后它们将被停用。在我看来,用户创建新传递的表单的一次URI是用户的麻烦,因为他只会登录一次然后永远忘记帐户。

注意:所有生成的密码在存储到数据库之前都会通过random_bytes()。密码生成后就会发送电子邮件,这实际上是密码可以纯文本显示的唯一时间(尽管通过SSL,这是值得的)。

1 个答案:

答案 0 :(得分:2)

根据您的描述,我知道您根本不需要用户帐户,否则您不会考虑立即删除帐户。选举似乎是匿名的,所以没有理由将选举与用户联系起来,这是正确的吗?

如果上述内容正确无误,您只需将电子邮件地址与随机令牌一起存储即可。令牌可以作为URL的一部分发送给用户。当用户单击该链接时,您可以检查此令牌是否存在,并在完成选举后删除电子邮件/令牌。这不需要用户名或密码。

令牌必须足够强(至少20个字符az AZ 0-9)并且只应将其散列存储在数据库中,但如果令牌足够强,则可以使用SHA-256之类的快速散列盐析,因此您可以在数据库中搜索它。