Originariamente inviata da
andbin
Il "minimo" per fare la cosa corretta e un pochino pulita (ma si potrebbe fare ancora meglio!) può essere questo, scritto e provato al volo:
codice:
public class DigestUtils {
private DigestUtils() {}
public static String md5Hex(String str) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(utf8Bytes(str));
BigInteger number = new BigInteger(1, digest);
return String.format("%032x", number);
}
private static byte[] utf8Bytes(String str) {
try {
return str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new Error("Grave error, UTF-8 not supported!");
}
}
}
Cosa significa “%032x”?
Cosa significa “1”?
Perché semplicemente non “BigInteger(digest)”?
Si converte tutto in Byte perché digest() vuole così, giusto?
Farei questa modifica:
codice:
package web1;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class FromStringToHash {
private String Code;
private String PreCode;
private String HashText;
public void FromStringToHash(String Code, String PreCode){
this.Code = Code;
this.PreCode = PreCode;
}
public void FromStringToHash(String Code){
this.Code = Code;
this.PreCode = "";
}
public static String hashConvert(String Password, String HashFunction) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance(HashFunction);
byte[] digest = md.digest(utf8Bytes(Password));
BigInteger number = new BigInteger(1, digest);
return String.format("%032x", number);
}
private static byte[] utf8Bytes(String str) {
try {
return str.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new Error("Errore grave, UTF-8 non supportato!");
}
}
public String combineString(String a, String b) {
try {
StringBuilder sb = new StringBuilder("");
sb.append(a);
sb.append(b);
return sb.toString();
}catch(Exception e){
throw new RuntimeException(e);
}
}
public String getHashText() {
try {
if(this.PreCode.equals("")){
// Vecchie versioni di Tomcat
String HF = "MD5";
HashText = hashConvert(this.Code, HF);
return HashText;
}else{
// Nuove versioni di Tomcat
String HF = "SHA3-512";
HashText = hashConvert(combineString(hashConvert(this.Code,HF), hashConvert(this.PreCode,HF)),HF);
return HashText;
}
} catch (Exception e){
throw new RuntimeException(e);
}
}
}
Per fare una cosa bella bisognerebbe che lo script calcolasse in automatico il sistema di conversione più evoluto del container ed usasse quello ma non saprei come fare (su IntelliJ ho java 1.10, sul server non posso saperlo). Tu sei in grado?