Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 生成密码重置的密码_Php_Hash_One Time Password - Fatal编程技术网

Php 生成密码重置的密码

Php 生成密码重置的密码,php,hash,one-time-password,Php,Hash,One Time Password,我正在做一个模块,允许用户重置密码。我注意到大多数网站都提供了确认链接,其中包含具有唯一哈希的查询字符串 我的问题是:每次同一用户请求忘记密码时,如何生成这个唯一的哈希?我是否应该将此哈希存储在数据库中,并在以后使用它进行验证?安全吗?或者我应该创建某种生成一次性密码的算法吗?如何生成OTP?是的,您应该 生成随机重置令牌。见例 将其存储在数据库中(可能有到期时间) 使用重置令牌向用户发送电子邮件 用户使用查询字符串中的重置令牌访问重置密码页面 检查数据库以查看与重置令牌关联的用户,以及是否过期

我正在做一个模块,允许用户重置密码。我注意到大多数网站都提供了确认链接,其中包含具有唯一哈希的查询字符串

我的问题是:每次同一用户请求忘记密码时,如何生成这个唯一的哈希?我是否应该将此哈希存储在数据库中,并在以后使用它进行验证?安全吗?或者我应该创建某种生成一次性密码的算法吗?如何生成OTP?是的,您应该

  • 生成随机重置令牌。见例
  • 将其存储在数据库中(可能有到期时间)
  • 使用重置令牌向用户发送电子邮件
  • 用户使用查询字符串中的重置令牌访问重置密码页面
  • 检查数据库以查看与重置令牌关联的用户,以及是否过期
  • 如果一切正常,则允许用户重置密码并从数据库中删除重置令牌
  • 关于重置令牌的生成(或者您想称之为什么)似乎有很多困惑。请阅读我链接到的答案,不要用散列和弱种子重新发明轮子。

    1)要生成唯一的散列,请混合当前时间、用户id和一些盐(文本)。例如,如果您的网站是mysite.com,请使用以下代码:

     $hash = md5(time() . $userid . 'mysite');
    
    这将创建一个很好的散列

    2) 可以,将其存储在数据库中。
    3) 是的,只要您在一段固定时间后使哈希过期,它就会安全。

    4) 不,生成一次性密码通常会惹恼用户。

    只需使用带有用户ID、用户salt(您对用户密码进行salt)和伪随机数据的哈希函数就可以了:

    $pwd_reset_hash=hash('sha256',$user_id.$user_salt,uniqid(“,true))

    将其作为该用户的重置键存储在数据库中(连同请求时间)

     user_id  pwd_reset_hash  time_requested  
    ===========================================  
     123      ae12a45232...   2010-08-24 18:05
    
    当用户尝试使用它时,请检查哈希值是否与用户匹配,以及时间是否最近(例如,“重置代码有效期为3小时”或类似内容)


    在使用或过期时将其从数据库中删除

    方法确实是生成某种随机事件并将其存储在数据库中。一旦更改密码,您就从表中删除相关记录,这样链接就不能再次使用

    • 将url邮寄给用户,包括“令牌”
    • 如果访问了链接,请检查令牌是否存在,允许用户更改密码
    • 从数据库中删除令牌

    正如在其他回答中已经提到的,对用户ID进行SHA1或MD5,结合微时间和一些盐字符串通常是安全的。

    不,不会,因为这是可预测的。如果他大幅更改盐,那么这将是不可预测的。没有必要准确地使用“mysite”。大家好,谢谢你们的快速回复。我将继续使用数据库方法=),我建议不要这样做。它不像
    time()
    那么糟糕,但仍然不安全。测量他和服务器之间的延迟的攻击者可能会猜出哈希值至少各1个20-50次。至少使用microtime来代替microtime…您好,我知道microtime是可以使用的。但假设我要做一个请求密码模块。用户提供他们的有效电子邮件,系统发送一封带有确认链接的电子邮件,该链接带有包含用户ID和哈希的查询字符串。当用户收到电子邮件并单击确认链接时,系统应将其带到相应页面并验证哈希是否正确?要再次检查此散列,如何使用microtime生成相同的散列???@artifact:Edited。有了
    uniqid
    和每个用户的散列,现在就不应该轻易猜测了,对吗?@artifact:你说的“猜测散列”是什么意思?你的意思是通过知道用户id、用户密码和salt来猜测重置密码散列吗?你能详细说明一下吗?嗨,Blizz,我想在数据库中存储是一种方式。感谢blizz1)盐最好足够大,这样它就不会被暴力破解中的几个散列猜到2)每次使用
    mtu rand
    有那么难吗?PHP中有一个函数可以创建加密安全的随机数,你为什么要重新发明一个“自制”的随机字符串生成器,它有一个加密弱散列(如MD5),由弱种子(如
    microtime
    )播种……没人说你不能将所有这些结合起来。我通常使用用户ID、2个随机数、微时间和一些随机字符串。大家好,请回答。我对反应的速度感到非常惊讶。哇!堆积如山的岩石!!附加建议:在存储到数据库之前,始终将重置密码散列,因为它也可以临时用作用户密码(我的意思是它可以像常规用户密码一样访问用户帐户)。在这个答案中,您说“生成唯一的随机重置密码”。这不是错误的方法,就是不正确的术语。如果我请求一个忘记的密码-和你的电子邮件地址-它应该给你发送一封电子邮件,随机字符串(又名nonce或token),但你现有的密码应该继续工作!这防止我仅仅通过知道你的用户名或帐户电子邮件就拒绝你的服务。所以,永远不要为用户生成一个真正的随机密码,这不是一个好方法。只生成一个随机令牌。@Kzqai“重置密码”并不意味着“已重置的密码”,但我明白你的意思,令牌或nonce是更好的选择。我已经编辑了答案。我可以使用以前用户的密码(散列)作为随机令牌吗?(第一步)?实际上,我需要它作为重置url的参数来传递它。我可以这样做吗?