Java 如何检查salt和hash密码的匹配

Java 如何检查salt和hash密码的匹配,java,salt,password-hash,secure-random,Java,Salt,Password Hash,Secure Random,我正在研究密码安全性和用户登录,更具体地说是在数据库中存储和匹配salt密码散列。我了解salt和hash的基本知识,但我不明白在每次哈希之前随机生成salt时,如何检查登录尝试中存储的哈希值 public static void test(String password) throws NoSuchAlgorithmException, InvalidKeySpecException { int iterations = 65536; char[] passChar = pas

我正在研究密码安全性和用户登录,更具体地说是在数据库中存储和匹配salt密码散列。我了解salt和hash的基本知识,但我不明白在每次哈希之前随机生成salt时,如何检查登录尝试中存储的哈希值

public static void test(String password) throws NoSuchAlgorithmException, InvalidKeySpecException {
    int iterations = 65536;
    char[] passChar = password.toCharArray();
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] salt = new byte[16];
    random.nextBytes(salt);

    PBEKeySpec spec = new PBEKeySpec(passChar, salt, iterations, 512);
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    byte[] hash = factory.generateSecret(spec).getEncoded();

    System.out.println(iterations + ":\n" + toHex(salt) + ":\n" + toHex(hash));
}

密码的salt应该与散列一起存储。有时这是作为散列的一部分完成的(例如,散列的前x个字符是salt),有时是单独完成的(例如,另一列)

检查密码时,不应生成新的随机密码,而应使用之前生成并存储的密码

因此,您可以使用用户提供的密码和存储的salt创建另一个散列,然后检查它是否与存储的散列匹配


大多数密码编码器为您提供了一种方法,例如,签出

可能需要存储盐的副本,因为
hash=passwd+salt
@Kayaman但盐可以按原样存储?@brisdalen是的。盐是用来防止散列破裂的。这本身不是敏感信息。