问题描述
我一直致力于一个旧的基于 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 (将#修改为@)