【发布时间】:2015-02-23 22:28:16
【问题描述】:
这是为密码生成盐的正确方法吗?
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...
【问题讨论】: