散列令牌到期后如何解密原始密码

时间:2015-08-07 11:39:09

标签: php security encryption hash

我正在使用PHP构建REST API,而我目前正致力于安全方面的工作。

我已经阅读了很多关于网络身份验证的内容并实施了一些建议的策略。

我会解释到目前为止我做了什么以及我遇到了什么。

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

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

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

P.S。我现在并不担心重放攻击,但如果我要对这种攻击实施安全性,我是否必须在客户端保留所有Nonce字符串的历史记录以及服务器端的所有cNonce字符串? / p>

谢谢。

编辑:

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

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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