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

Php 哈希令牌过期后如何解密原始密码,php,security,encryption,hash,Php,Security,Encryption,Hash,我正在用PHP构建一个RESTAPI,目前我正在进行安全方面的工作 我读了很多关于网络身份验证的书,并实施了一些建议的策略 我会解释到目前为止我做了什么,我在哪里被卡住了 为了防止黑客知道我数据库中所有用户的密码,我在数据库中只保留了一个哈希版本的密码。我使用php password_hash()函数自动创建salt。此外,哈希密码在使用原始密码登录30分钟后过期 为了防止嗅探器在请求头中看到哈希密码,客户端在每个请求中发送几个头:一个时间戳、一些随机字符串和哈希+时间戳+随机字符串+url组合

我正在用PHP构建一个RESTAPI,目前我正在进行安全方面的工作

我读了很多关于网络身份验证的书,并实施了一些建议的策略

我会解释到目前为止我做了什么,我在哪里被卡住了

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

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

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

另外,我现在不担心重播攻击,但如果我要实现针对此类攻击的安全性,我是否必须保留客户端所有Nonce字符串和服务器端所有cNonce字符串的历史记录

多谢各位

编辑:

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

现在,我的问题是当散列令牌过期(30天后)时会发生什么 分钟)?用户现在需要发送其原始密码以获取密码 新令牌,但服务器仅保留原始密码的哈希

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

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

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

哈希是一种方法,您不能“解密”当密码被散列时。让我们用这个类比:这就像试图使用磨碎的/散列的肉,想让它再次看起来像黑色安格斯;-)你可能有点想过头了。对于你试图保护的东西来说,这种复杂程度是合理的吗?@Fred ii-好吧,也许我“错了”我的问题。我知道你不能解开散列。我的问题是允许服务器从用户输入中获得相同的散列结果:散列(纯文本密码+时间戳+随机字符串+url)。服务器必须知道纯文本密码才能获得相同的组合哈希结果。这取决于使用哪个算法对其进行哈希。我在某个地方读到一些算法可以在腌制之前生成相同的散列。看,他们在那里谈论它。是的,我想避免使用https。我正在寻找一种策略,在正常的http连接中发送纯文本密码,这种方式没有人能够破译它,而且仍然不必将纯文本密码存储在数据库中。无论如何,谢谢。这是不可能的,除非你是一个专业的密码学家,你有10年的时间来完善你的算法。然后你就可以设计https了。