我会使用哈希码来验证密码重置网址中的详细信息。这一切都可以在不向数据库写入任何内容或向攻击者发送任何特权信息的情况下完成。
简单解释一下普通的密码加盐和散列;假设盐为1111,密码为password,您将连接两者并散列字符串1111password,假设这给了您9999的散列,然后您将存储原始盐@987654325 @ 并在您的用户记录中散列 9999。
当您验证密码时,您使用存储的盐,连接密码尝试,对其进行散列并与存储的散列进行比较。例如 asecret 变为 1111asecret 但散列为 8888。这与原始哈希不匹配,因此密码匹配失败。
当然,盐和哈希通常会使用已建立的加密库正确生成和计算(不要自己发明!)。
对于密码重置 URL,我会输入用户的唯一标识符,即电子邮件地址、发出请求的日期和新的哈希值。这个哈希值是由那些连接在一起的细节加上已经为用户存储的盐和哈希值生成的。
例如:
Email: user@example.com
Request Date: 2014-07-17
Salt: 1111
Hash: 9999
生成一个新的哈希值,即'user@example.com2014-07-1711119999',假设这给出了7777的哈希值。
然后我生成的 URL 将包含电子邮件、请求日期和新哈希:
https:\\www.example.com\ResetPassword?email=user@example.com&requestdate=2014-07-17&hash=7777
服务器会将电子邮件和提供的日期与它的盐和哈希结合起来,并确认它生成的哈希与提供的相同。如果这没问题,那么它将显示重置表单,其中隐藏了相同的三个参数,否则会出错。当输入新密码以防止该表单被欺骗时,这些将被重新提交并重新检查。
需要提供电子邮件地址才能提出请求,并且仅通过电子邮件将其发送到同一地址。日期几乎不是特权信息,而且哈希是不可逆的,所以无论如何都没有给出任何信息。没有向数据库写入任何内容,任何篡改参数都会导致哈希失败并且 URL 报告错误。