盐认证

时间:2019-01-06 18:36:04

标签: java authentication salt sha

我正在尝试编写登录活动,我在下面编写了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();
    }

}

1 个答案:

答案 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输出长度)。