SHA1哈希密码迁移至KeyCloak RH-SSO 7.5.0.GA登录失败问题咨询
问题原因
迁移后登录失败由两个核心错误导致:
- 你调用API时指定的
pbkdf1-sha1算法和现有存储的无盐单次SHA1哈希逻辑不匹配:即使迭代次数设为1,Keycloak内置的PBKDF1实现也会按标准做密钥派生计算,结果和直接对明文做SHA1生成的哈希值完全不同。 - Red Hat SSO 7.5.0.GA(对应上游Keycloak 15.x版本)的凭证存储有固定序列化格式,你直接把明文哈希串填入
secretData、传入空字符串作为盐值的写法不符合内部存储规范——Admin API不会对凭证字段做格式校验,所以请求会正常返回,但实际存储的凭证是无效的,校验时永远无法匹配。
正确实现方式
有两种生产可用的方案,优先选择第二种懒迁移方案,风险最低。
方案一:自定义密码哈希SPI批量导入
适合需要一次性全量迁移所有用户数据的场景:
- 开发自定义密码哈希SPI:实现
PasswordHashProvider和对应Factory接口,校验逻辑为:对用户登录时输入的明文密码直接做SHA1哈希,转十六进制小写字符串后,和存储的哈希值做精确匹配。 - 将SPI打包为jar部署到RH SSO的
standalone/deployments目录,重启实例后在控制台「认证-密码策略」中确认自定义算法已被识别。 - 调用Admin API写入凭证时,严格遵循Keycloak的凭证字段格式,示例请求体如下:
{ "credentials": [ { "type": "password", "algorithm": "custom-sha1-nosalt", "hashIterations": 1, "secretData": "{\"value\":\"b017da8c710a97862be7a686440c91464cddd905\"}", "credentialData": "{\"hashIterations\":1,\"algorithm\":\"custom-sha1-nosalt\"}" } ] }
提示:用户首次用密码登录成功后,RH SSO会自动将密码用系统默认的高安全强度算法(默认是PBKDF2-SHA256,迭代次数27500)重新哈希后覆盖原有凭证,等所有用户完成一次登录后,就可以移除自定义哈希SPI,自动完成算法升级。
方案二:用户联邦SPI懒迁移(推荐)
不需要提前批量导入密码哈希,全程无批量操作风险,用户无感知:
- 开发
UserStorageProvider用户联邦SPI,对接你原有用户存储:当RH SSO本地用户库校验密码失败时,自动调用联邦逻辑,将用户输入的明文密码做无盐SHA1哈希后,和旧存储中的哈希值做比对。 - 如果旧存储校验通过,RH SSO会自动将本次输入的明文密码用默认高安全算法哈希后存入本地用户库,后续该用户登录会直接走本地校验,不再请求旧存储。
- 上线后观察一段时间,等所有活跃用户都完成至少一次登录后,就可以下线旧用户存储和联邦SPI,完成全量迁移。
额外注意事项
不要尝试直接使用RH SSO内置的sha1算法做迁移:内置的SHA1哈希提供者强制要求使用随机盐,和你现有无盐的哈希格式不兼容,强行写入会导致校验逻辑错乱。
内容的提问来源于stack exchange,提问作者onlinejava
相关产品推荐
相关产品推荐

