为什么这个 PBKDF2 函数每次都输出不同的哈希值
how come this PBKDF2 function outputs different hash every time
我正在使用 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();
然后我使用准备好的语句 SELECT
在我的 MySQL table 中保存盐 (BINARY(64)
) 和散列密码 (BINARY(255)
)。
当我尝试验证用户时,我首先获取盐,用它生成密码哈希,然后在用户的 SELECT
查询中使用它。
盐被正确获取并且每次都相同,但生成的哈希值总是不同的。
我转载了here
编辑:在上面的link中,错误确实是我必须使用Arrays.equals(a, b)
来比较两个byte[]
。
我的问题是,当我将 salt 和密码都插入为 BINARY()
时,MySQL 用零填充了 byte[]
,所以当我获取它时,它们都有尾随的 0。我通过更改盐和密码长度以匹配数据库来解决我的问题。
我正在使用 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();
然后我使用准备好的语句 SELECT
在我的 MySQL table 中保存盐 (BINARY(64)
) 和散列密码 (BINARY(255)
)。
当我尝试验证用户时,我首先获取盐,用它生成密码哈希,然后在用户的 SELECT
查询中使用它。
盐被正确获取并且每次都相同,但生成的哈希值总是不同的。
我转载了here
编辑:在上面的link中,错误确实是我必须使用Arrays.equals(a, b)
来比较两个byte[]
。
我的问题是,当我将 salt 和密码都插入为 BINARY()
时,MySQL 用零填充了 byte[]
,所以当我获取它时,它们都有尾随的 0。我通过更改盐和密码长度以匹配数据库来解决我的问题。