【发布时间】:2010-11-14 00:46:26
【问题描述】:
用例:“我忘记了密码”按钮。我们找不到用户的原始密码,因为它以散列形式存储,所以唯一要做的就是生成一个新的随机密码并通过电子邮件发送给他。这需要密码学上不可预测的随机数,而 mt_rand 不够好,通常我们不能假设托管服务将提供对操作系统的访问以安装密码随机数模块等,所以我正在寻找一种方法在 PHP 本身中生成安全的随机数。
到目前为止,我提出的解决方案包括存储一个初始种子,然后为每个调用存储,
result = seed
seed = sha512(seed . mt_rand())
这是基于 sha512 散列函数的安全性(mt_rand 调用只是为了让获取数据库副本的对手更加困难)。
是我遗漏了什么,还是有更好的解决方案?
【问题讨论】:
-
拦截电子邮件可能比尝试猜测有效的密码重置令牌更容易。
-
编辑:正如下面评论中所指出的,random.org 不推荐用于密码学。如果你觉得可以看看Random.org您的应用程序保证真正的随机数。他们有多种语言的客户端界面:http://www.random.org/clients/http/archive/
-
仅供参考,发送新密码是非常糟糕的用户体验。向他们发送一个可以设置新密码的表单的链接。