如何在不知道客户端密码盐的情况下实现 WSSE 身份验证?

问题描述

我一直致力于一个旧的基于 Symfony 2/3 的 WebApp 项目,该项目提供带有 WSSE 身份验证的 REST Api。这很好用,因为这个旧项目创建并存储了密码盐本身。然后,客户端可以请求并在 WSSE 身份验证期间使用盐。

然而,在较新的 Symfony 安装(以及较新的 PHP 版本)中,salt 不应该/不能手动指定,而是由 PHP 自动创建并与密码哈希一起存储为单个值。

所以客户端不能再请求盐了。如何解决


Tl;DR

旧项目中的当前 WSSE 工作流程:

  • 服务器存储散列的用户密码和使用的盐
  • 客户端向服务器请求盐
  • 客户端使用 salt 创建散列密码
  • 客户端使用 nonce(= 一些随机文本)、当前时间戳和散列密码来组成一个字符串,该字符串用作创建 SHA1 摘要的输入。
  • 客户端将摘要随机数和时间戳发送到服务器
  • 服务器使用随机数、时间戳和他自己的散列密码作为摘要
  • 服务器将收到的摘要与其自己的摘要进行比较。等于 = 身份验证成功。

服务器不知道普通密码,因为它只存储散列密码。所以客户端需要知道使用的盐来创建相同的哈希密码。

如果服务器不再单独存储盐(正如当前 PHP 版本中强烈建议的那样),如何做到这一点?

从密码哈希中提取盐?

bcrypt salt 与散列密码一起存储在组合字符串中。所以我可以手动从密码哈希中提取盐并将其发送给客户端。

虽然这行得通,但这是一个非常棘手的解决方案,不是吗?

将客户端请求中的普通密码发送到服务器?

  • 客户端使用普通密码而不是散列密码来创建摘要
  • WSSE 请求中包含普通密码
  • 服务器根据其散列密码检查收到的普通密码。如果使用 OK 摘要,则检查以验证随机数和时间戳。

虽然这可行,但它包括将普通密码发送到服务器。当然应该只使用安全的 TLS 连接,但是发送纯文本凭据仍然感觉不对。

另外,这不再是 WSSE,是吗?

如何解决

WSSE 是否总是包括知道客户端上的密码盐?用现代散列方法实现这一点的正确方法是什么,这些方法不再需要海关盐?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...