我目前正在尝试用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()作为种子,因此输出不同,但每次重启后它保持不变。