SecureRandom在每次重启时都使用相同的种子吗?

时间:2018-02-02 00:38:46

标签: java random passwords random-seed

我目前正在尝试用Java实现密码哈希管理器。寻找实现这一目标的最佳方法,我学会了盐。

这是我发现的generateSalt函数:

public static byte[] generateSalt() throws NoSuchAlgorithmException {
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] salt = new byte[8];
    random.nextBytes(salt);
    return salt;
}

然后我只是尝试了这个:

public class Application {
    public static void main(String[] args) {
        try {
            for(int i = 0; i < 10; i++) {
                System.out.println(PasswordHash.generateSalt());
            }
        }
        catch(Exception e) {
            System.out.println(e.getStackTrace());
        }
    }
}

输出是:

135fbaa4 45ee12a7 330bedb4 2503dbd3 4b67cf4d 7ea987ac 12a3a380 29453f44 5cad8086 6e0be858

但如果我重新启动我的应用程序,结果仍然相同。我发现盐对每个用户都是独一无二的。因此,让我们想象一下,我希望能够在我的应用程序中创建数据库用户。我创建用户1,生成的盐是135fbaa4。

然后我重启我的应用程序并创建用户2,所以生成的盐也将是135fbaa4,对吗?

文件说:

  

public void nextBytes(byte [] bytes)

     

生成用户指定的号码   随机字节。如果先前没有发生过对setSeed的调用,那么   第一次调用此方法会强制此SecureRandom对象播种   本身。如果先前使用setSeed,则不会发生这种自播种   调用。

这种种子是问题吗?觉得我错过了什么。 我尝试使用System.currentTimeMillis()作为种子,因此输出不同,但每次重启后它保持不变。

0 个答案:

没有答案