gpt4 book ai didi

java - 我对加盐和 SHA-512 哈希密码的实现是否正确/安全?

转载 作者:行者123 更新时间:2023-12-02 22:04:44 25 4
gpt4 key购买 nike

我对加盐和 SHA-512 哈希密码的实现是否正确/安全?

我知道我应该对加盐密码迭代算法几次。除此之外,我还应该实现哪些措施来确保其安全,或者这是否足够?

        public static String[] SHA512(String password)
{
//Generates the salt
SecureRandom saltRandomizer = new SecureRandom();
byte[] salt = new byte[64]; //The same size as the output of SHA-512 (512 bits = 64 bytes)
saltRandomizer.nextBytes(salt);
String encodedSalt = Base64.encodeToString(salt, Base64.DEFAULT);


//Prepends the salt to the password
String saltedPassword = encodedSalt + password;

//Hashed the salted password using SHA-512
MessageDigest digester;
byte[] digest = null;
try {
digester = MessageDigest.getInstance("SHA-512");
digester.reset();
digester.update(saltedPassword.getBytes());
digest = digester.digest();
} catch (NoSuchAlgorithmException e) {
System.out.println("No such algorithm");
e.printStackTrace();
}

String[] passwordPlusSalt = new String[2];
passwordPlusSalt[0] = Base64.encodeToString(digest, Base64.DEFAULT);
passwordPlusSalt[1] = encodedSalt;
return passwordPlusSalt;
}

提前致谢

最佳答案

没有。这是不安全的。看一下这一行:

SecureRandom saltRandomizer = new SecureRandom();

我注意到您没有指定 PRNG 或提供商。我不是专家,但我了解 SUN CSP 默认是在 Solaris 和 Linux 上使用 sun.security.provider.NativePRNG,它仅提供/dev/urandom 的输出,这可能(或可能不)适合您的需求(例如,不建议将其用于生成加密 key )。

因此,建议始终指定 PRNG 和提供商,如下所示:

SecureRandom.getInstance("SHA1PRNG", "SUN");

此外,建议:

  • 定期丢弃现有的 java.security.SecureRandom 实例并创建一个新实例。这将生成一个带有新种子的新实例。
  • 通过调用 java.security.SecureRandom.setSeed(java.security.SecureRandom.generateSeed(int)) 定期向 PRNG 种子添加新的随机 Material 。

我要表达的观点是,安全性是一个复杂的话题,很容易出错。不要尝试自制解决方案。使用现有的库。引用 Thomas Pornin 的精彩回答:

Complexity is bad. Homemade is bad. New is bad.

来源:

关于java - 我对加盐和 SHA-512 哈希密码的实现是否正确/安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21836618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com