微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在不知道客户端密码盐的情况下实现 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?