我正在尝试编写登录活动,我在下面编写了hashPassword
函数。为什么对于相同的盐和密码却给出不同的结果?
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
try { System.out.println("test1: "+hashPassword("[B@2b1e4124","bfnfnfjfjf"));
System.out.println("test2: "+hashPassword("[B@2b1e4124","bfnfnfjfjf"));}
catch (NoSuchAlgorithmException | InvalidKeySpecException e){}
}
public static String hashPassword(String password, String salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
char[] passwordChars = password.toCharArray();
byte[] saltBytes =salt.getBytes();
PBEKeySpec spec = new PBEKeySpec(
passwordChars,
saltBytes,
5000,
10
);
SecretKeyFactory key = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
byte[] hashedPassword = key.generateSecret(spec).getEncoded();
return hashedPassword.toString();
}
}
答案 0 :(得分:1)
您的哈希实际上每次都计算相同的结果,但是您在结果字节数组上调用toString
。这将返回一个调试字符串,每个实例都不同(有关详细信息,请参见this question)。
代替
return hashedPassword.toString();
您应该
return hashedPassword;
...并直接使用byte[]
。
如果要以人类可读的格式显示哈希,则可以这样打印:
String hashString = new BigInteger(1, hashedPassword).toString(16);
System.out.println(hashString);
您的代码中还有第二个错误。 PBEKeySpec
构造函数的第四个参数是长度,单位为 bits 。 10太短而无法使用。您可能需要512(SHA512输出长度)。