【问题标题】:How to check match for salted and hashed password如何检查加盐和散列密码的匹配
【发布时间】:2023-08-11 21:25:01
【问题描述】:

我正在研究密码安全性和用户登录,尤其是在数据库中存储和匹配加盐密码哈希。我了解加盐和散列的基础知识,但我不明白当盐是在每个散列之前随机生成时,我应该如何在登录尝试时检查存储的散列值?

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));
}

【问题讨论】:

  • 盐也需要储存,因为hash = passwd + salt
  • @Kayaman 但是盐可以按原样存储吗?
  • @brisdalen 是的。 Salt旨在防止pre-made tables进行哈希破解。它本身不是敏感信息。

标签: java salt password-hash secure-random


【解决方案1】:

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

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

因此,您使用用户提供的密码和存储的盐创建另一个哈希,然后检查它是否与存储的哈希匹配。

大多数密码编码器都为您提供了一种方法,例如,查看this article that explains how to use BCrypt Password Encoder.

【讨论】: