我正在使用 pbkdf2 对我的密码进行哈希处理。 我采用纯字符串密码,生成盐,然后像这样散列它:
byte[] salt = SecureRandom.getSeed(16);
KeySpec spec = new PBEKeySpec(
password.toCharArray(),
salt,
iterations,
keyLength * 8
);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] generatedSecret = f.generateSecret(spec).getEncoded();
然后,我使用准备好的语句 BINARY(64)
将盐 ( BINARY(255)
) 和哈希密码 ( SELECT
) 保存在我的 MySQL 表中.
当我尝试验证用户时,我首先获取盐,用它生成密码哈希并在 SELECT
中使用它。为用户查询。
盐被正确获取并且每次都是相同的,但生成的哈希总是不同的。
我转载了它here
编辑:在上面的链接中,错误确实是我必须使用 Arrays.equals(a, b)
比较两个byte[]
.
最佳答案
我的问题是,当我将盐和密码插入为BINARY()
时,MySQL会用零填充byte[]
,所以当我获取它时,它们都有尾随 0。我通过更改盐和密码长度以匹配数据库来解决我的问题。
关于java - 为什么这个 PBKDF2 函数每次都会输出不同的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62374176/