我一直在从事一个旧的基于symfony 2/3的webapp项目,该项目提供带有wsse身份验证的rest api。这很好,因为这个旧项目创建并存储密码salt本身。客户端可以请求salt,并在wsse身份验证期间使用salt。
但是,在较新的symfony安装(以及较新的php版本)中,salt不应该/不能手动指定,而是由php自动创建,并与密码散列一起存储为单个值。
因此,客户不能再要求提供盐了。如何解决这个问题?
tl;博士
旧项目中的当前wsse工作流:
服务器存储散列的用户密码和使用过的密码
客户端从服务器请求salt
客户端使用salt创建哈希密码
客户端使用nonce(=一些随机文本)、当前时间戳和散列密码组成字符串,该字符串用作创建sha1摘要的输入。
客户端将摘要、nonce和时间戳发送到服务器
服务器将nonce、时间戳和他自己的哈希密码用于摘要。
服务器将收到的摘要与其自己的摘要进行比较。equal=身份验证成功。
服务器不知道普通密码,因为它只存储哈希密码。因此,客户端需要知道使用的salt来创建相同的哈希密码。
当服务器不再单独存储盐(如当前php版本中强烈建议的那样)时,如何做到这一点?
从密码散列中提取盐?
bcrypt salt与哈希密码一起存储在一个组合字符串中。因此,我可以手动从密码散列中提取salt并将其发送给客户端。
虽然这会起作用,但这是一个相当棘手的解决方案,不是吗?
是否在客户端请求中将普通密码发送到服务器?
客户端使用普通密码而不是哈希密码来创建摘要。
wsse请求中包含普通密码
服务器根据其哈希密码检查收到的普通密码。如果使用了ok digest,则选中该复选框以验证nonce和timestamp。
虽然这会起作用,但它包括向服务器发送普通密码。当然,只应使用安全tls连接,但发送纯文本凭据仍然感觉不正确。
另外,这不再是wsse了,是吗?
如何解决?
wsse是否总是包括了解客户端上的密码?用现代散列方法实现这一点的正确方法是什么?
暂无答案!
目前还没有任何答案,快来回答吧!