【发布时间】:2020-12-21 14:16:49
【问题描述】:
我想将我的用户从我的应用程序迁移到外部 SSO。我希望我的用户保留他们现有的密码,因此我想检索散列密码并将其提供给 SSO 应用程序。两边的算法都是一样的(pbkdf2-sha256),所以它应该可以工作。
因此我需要能够从数据库中的条目中检索盐和哈希密码。
我的应用程序使用 Spring Security。
看来我需要手动执行此操作,因为 Pbkdf2PasswordEncoder 实现的接口 PasswordEncoder 没有提供从存储值中检索初始元素的方法。
实现这一目标的正确方法是什么?
谢谢
编辑:
这是我的代码
Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder("", 27500, 512);
String encoded = encoder.encode("password");
System.out.println(encoded); // prints the hex encoded hashed password: 2a319aaf0252d77e671cf1b074f149f7eed1b362afb47bef84e9b01a8140b26a733cd22df007d68668915c7bd51af9eefda1662216a184fa7eb034c176ce9518fc83f3fd935a2d3d
final byte[] digested = Hex.decode(encoded);
byte[] salt = EncodingUtils.subArray(digested, 0, 7);
byte[] password = EncodingUtils.subArray(digested, 8, digested.length);
System.out.println(new String(Base64.getEncoder().encode(salt))); // prints KjGarwJS134=
System.out.println(new String(Base64.getEncoder().encode(password))); // prints HPGwdPFJ9+7Rs2KvtHvvhOmwGoFAsmpzPNIt8AfWhmiRXHvVGvnu/aFmIhahhPp+sDTBds6VGPyD8/2TWi09
如果我然后转到this website 并输入以下值:
- 主密码:密码
- 盐:KjGarwJS134=
- 迭代:27500
- dkLen: 512
- PBE 密码:sha256
然后我希望输出与我的代码的最后一个输出相匹配,但事实并非如此。
【问题讨论】:
-
@Vladimir 我认为他们想要访问 RAW 散列(但加密)密码位。并将该信息传输到新的 SSO 服务(这意味着用户不必更改密码)。
-
弗拉基米尔,GhostCat 是对的,我只需将原始密码复制到一个新软件,它以不同的方式存储它(base64 与十六进制等,...)但使用相同的哈希算法。所以基本上我需要从存储的条目中检索盐。
-
@sroup 我猜在线工具有问题/不同。我尝试了您的代码并使用盐和密码生成了一个新的哈希,结果是相等的。所以盐是正确的。不过,我设置
encoder.setAlgorithm(SecretKeyFactoryAlgorithm.PBKDF2WithHmacSHA256);使用您想要的算法。
标签: java spring spring-security password-hash