gpt4 book ai didi

Java SecureRandom 作为盐

转载 作者:行者123 更新时间:2023-11-29 06:29:41 26 4
gpt4 key购买 nike

这是生成密码盐的正确方法吗?

        SecureRandom random = new SecureRandom();
byte[] salt = random.generateSeed(64);

String decoded = new String(salt, "Cp1252");
System.out.println(decoded);

我正在尝试生成新密码 (SHA-512),因此我还需要盐。
散列密码将是 = 用户密码 + salt ...这是正确的吗?
这些奇怪的字符不会“破坏”数据库(MySQL)吗? (更新:不,因为盐应该被加密/编码/散列并且结果不应该使用奇怪的字符)

少量输出:

ã2}wÑ»-ÄKÇæꮃzR4qÉÖÙÚ!ž0ÉW9;*Vß4x»)
àöˆ˜£¿{,J¼…HþTù#+Bv(Fp´G~Aò`^e_ElpíÜžS A!­ñÛz‹y@`ý‡)‡ª€
5a£Æ.¥sgöfÈB:4-�y$Óx%Óâyý¾N¨…áq

这些盐也应该编码为 SHA-512 吗? (更新:使用来自 apache commons encode 的 base64 库进行编码,见下文)

更新:

        SecureRandom random = new SecureRandom();
byte[] saltArr = new byte[64];
random.nextBytes(saltArr);

String salt = new String(saltArr, "Cp1252");
System.out.println("SALT:"+salt);


byte[] encodedBytes = Base64.encodeBase64(saltArr);
System.out.println("Encoded SALT:" + new String(encodedBytes));

byte[] decodedBytes = Base64.decodeBase64(encodedBytes);
System.out.println("Decoded SALT:" + new String(decodedBytes, "Cp1252"));


//SHA
String target = "Test";
MessageDigest sh = MessageDigest.getInstance("SHA-512");
sh.update(target.getBytes());
StringBuffer sb = new StringBuffer();
for (byte b : sh.digest()) sb.append(Integer.toHexString(0xff & b));
System.out.println("Hashed PWD:"+sb);

//And then joining them together...

最佳答案

首先,使用 nextBytes 就足够了(实际上调用 PRNG)而不是 generateSeed .后者使用种子生成算法,这是一个更复杂的操作,因为它需要一个熵源(800-90A p19-23)

The primary function of salts is to defend against dictionary attacks versus a list of password hashes and against pre-computed rainbow table attacks. (Wikipedia)

换句话说,you need a different salt for each password ,但是盐不是 secret (您将把它与摘要输出一起存储),并且您PRNG 的输出应该没问题。

此外,由于盐(可能包含整个范围 0x00-0xFF 中的字节)将作为字符串保留,因此应将其编码*在 Base64 中。 (或另一种字符集安全编码,例如 base 85,但 base64 更为常用)。

* SHA is not an encryption function .

SecureRandom random = new SecureRandom();
byte[] salt = new byte[64];
random.nextBytes(salt);

String password="god";
MessageDigest md = MessageDigest.getInstance("SHA-512");
md.update(password.getBytes(Charset.forName("UTF-8")));
md.update(salt);

byte[] digest = md.digest();

关于Java SecureRandom 作为盐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684740/

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