如何在哈希令牌过期后解密原始密码


How to decrypt original password after hash token expires

我正在用PHP构建一个REST API,目前我正在做安全方面的工作。

我读了很多关于网络认证的文章,并实现了一些建议的策略。

我将解释到目前为止我所做的以及我在哪里遇到了困难。

为了防止黑客知道所有用户的密码,如果他们得到了我的数据库,我只在db中保留了密码的散列版本。我使用php password_hash()函数自动创建一个盐。此外,散列密码在使用原始密码登录后30分钟过期。

为了防止嗅探器在请求头中看到散列密码,客户端在每个请求中发送几个头:时间戳,一些随机字符串和hash+timestamp+random_string+url组合的散列校验和。

现在,我的问题是当哈希令牌过期时(30分钟后)会发生什么?用户现在需要发送原始密码以获得新的令牌,但是服务器只保留原始密码的散列。使用校验和方法不起作用,因为服务器需要原始密码才能获得正确的结果进行哈希比较。因此,它无法知道用户密码是否正确。

注:我现在并不担心重放攻击,但是如果我要实现针对这种攻击的安全性,我是否必须在客户端保存所有Nonce字符串的历史记录,并在服务器端保存所有Nonce字符串的历史记录?

谢谢。编辑:

文档说明password_hash()使用bcrypt算法自动处理盐的创建。对于校验和字符串,我使用SHA256算法对其进行哈希。

现在,我的问题是当哈希令牌到期时会发生什么(在30之后)分钟)?用户现在需要发送他们的原始密码来获得一个新的令牌,但服务器只保留原始密码的哈希值。

只需使用password-verify函数来验证客户端发送给您的明文密码是否与您在数据库中存储的哈希值匹配。

  • $password是用户提供的密码(不是散列)。
  • $hash为存储在用户数据库记录中的密码哈希,包含算法、盐和哈希值。

复杂性是安全的敌人。让事情尽可能简单。确保您的连接是通过HTTPS -这将加密和验证传输中的密码数据,HTTPS使用TLS/SSL,这也可以防止重放攻击。