Java KeyClope自定义密码HashProvider,每个连接上的盐更改

Java KeyClope自定义密码HashProvider,每个连接上的盐更改,java,keycloak,provider,salt,Java,Keycloak,Provider,Salt,我正在尝试创建一个自定义PasswordHashProvider。 我成功地创建了组件,算法正在运行,保存在数据库中的密码是正确的 盐存储在数据库中,但我不知道如何存储。我以为是64号盐,但不匹配 database secret_data : {"value":"v8Po+hMGZbS2tWr4IGRXqy3FJyQIavjsrpXHwomWHwRRs+iRVInd+9naF681EENm76lF1omK+BqsPIRrtKH1VQ==","sa

我正在尝试创建一个自定义PasswordHashProvider。 我成功地创建了组件,算法正在运行,保存在数据库中的密码是正确的

盐存储在数据库中,但我不知道如何存储。我以为是64号盐,但不匹配

database secret_data : {"value":"v8Po+hMGZbS2tWr4IGRXqy3FJyQIavjsrpXHwomWHwRRs+iRVInd+9naF681EENm76lF1omK+BqsPIRrtKH1VQ==","salt":"DEiO17h4/+6gwzxn"}
database credential_data : {"hashIterations":5000,"algorithm":"message-digest"} 
创建密码和连接用户时,我会在控制台中添加日志。salt是生成、存储的,但在连接过程中检索到的salt在每次尝试时都是不同的

当我注册用户密码时:

New salt : [B@7bb894a0
当我尝试连接用户时:

Existing salt: [B@d433036
// retry connection
Existing salt: [B@355bae9a
有人知道盐是如何储存的吗?

我的类(对于测试,我强制迭代次数为5000):

import org.keydape.credential.hash.PasswordHashProvider;
导入org.keydape.models.PasswordPolicy;
导入org.keydove.models.credential.PasswordCredentialModel;
导入java.util.Base64;
导入java.security.MessageDigest;
导入java.security.SecureRandom;
导入java.nio.charset.StandardCharset;
导入java.math.biginger;
导入java.security.NoSuchAlgorithmException;
公共类MessageDigestPasswordHashProvider实现PasswordHashProvider{
私人最终迭代;
私有最终字符串providerId;
私有字节[]盐;
public MessageDigestPasswordHashProvider(字符串providerId,int-defaultIterations){
this.providerId=providerId;
this.defaultIterations=defaultIterations;
}
@凌驾
公共布尔策略检查(PasswordPolicy策略、PasswordCredentialModel凭据){
int=5000;
返回凭证.getPasswordCredentialData().getHashIterations()==policyHashIterations
&&providerId.equals(credential.getPasswordCredentialData().getAlgorithm());
}
@凌驾
公共密码CredentialModelEncodedCredential(字符串密码,整数迭代){
迭代次数=5000次;
字节[]salt=生成salt();
盐=盐;
系统输出打印(“新盐:”);
系统输出打印LN(盐);
字符串encodedPassword=encode(rawPassword,迭代次数);
返回PasswordCredentialModel.createFromValues(providerId、salt、iterations、encodedPassword);
}
@凌驾
公共字符串编码(字符串密码,整数迭代){
迭代次数=5000次;
字节[]salt=this.salt;
系统输出打印(“盐功能编码:”);
系统输出打印LN(盐);
字符串salted=rawPassword+“{”+salt.toString()+“}”;
byte[]digest=getSha512(salted.getBytes());
System.out.println(迭代);
对于(int i=1;i
盐存储在数据库中,但我不知道如何存储。我想 这是64号盐,但不匹配

database secret_data : {"value":"v8Po+hMGZbS2tWr4IGRXqy3FJyQIavjsrpXHwomWHwRRs+iRVInd+9naF681EENm76lF1omK+BqsPIRrtKH1VQ==","salt":"DEiO17h4/+6gwzxn"}
database credential_data : {"hashIterations":5000,"algorithm":"message-digest"} 
它基于64

盐是生成、存储的,但在连接过程中检索到的 每次尝试都不一样

问题是:

System.out.print("New salt : ");
System.out.println(salt);
您打印的不是盐的实际含量,而是对象“salt”

请尝试:

System.out.println(Arrays.toString(this.salt));