如何解决如何在不知道客户端密码盐的情况下实现 WSSE 身份验证?
我一直致力于一个旧的基于 Symfony 2/3 的 WebApp 项目,该项目提供带有 WSSE 身份验证的 REST Api。这很好用,因为这个旧项目创建并存储了密码盐本身。然后,客户端可以请求并在 WSSE 身份验证期间使用盐。
然而,在较新的 Symfony 安装(以及较新的 PHP 版本)中,salt 不应该/不能手动指定,而是由 PHP 自动创建并与密码哈希一起存储为单个值。
所以客户端不能再请求盐了。如何解决?
Tl;DR
旧项目中的当前 WSSE 工作流程:
- 服务器存储散列的用户密码和使用的盐
- 客户端向服务器请求盐
- 客户端使用 salt 创建散列密码
- 客户端使用 nonce(= 一些随机文本)、当前时间戳和散列密码来组成一个字符串,该字符串用作创建 SHA1 摘要的输入。
- 客户端将摘要、随机数和时间戳发送到服务器
- 服务器使用随机数、时间戳和他自己的散列密码作为摘要。
- 服务器将收到的摘要与其自己的摘要进行比较。等于 = 身份验证成功。
服务器不知道普通密码,因为它只存储散列密码。所以客户端需要知道使用的盐来创建相同的哈希密码。
如果服务器不再单独存储盐(正如当前 PHP 版本中强烈建议的那样),如何做到这一点?
从密码哈希中提取盐?
bcrypt salt 与散列密码一起存储在组合字符串中。所以我可以手动从密码哈希中提取盐并将其发送给客户端。
将客户端请求中的普通密码发送到服务器?
虽然这可行,但它包括将普通密码发送到服务器。当然应该只使用安全的 TLS 连接,但是发送纯文本凭据仍然感觉不对。
另外,这不再是 WSSE,是吗?
如何解决?
WSSE 是否总是包括知道客户端上的密码盐?用现代散列方法实现这一点的正确方法是什么,这些方法不再需要海关盐?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。