decrypt - ¿Cómo hash string con sha256 en Java?
sha2 java (10)
¿Cómo hash string con sha256 en Java? ¿Alguien sabe alguna biblioteca gratis para esto?
Aquí hay una forma un poco más eficiente de convertir el resumen en una cadena hexagonal:
private static final char[] hexArray = "0123456789abcdef".toCharArray();
public static String getSHA256(String data) {
StringBuilder sb = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(data.getBytes());
byte[] byteData = md.digest();
sb.append(bytesToHex(byteData);
} catch(Exception e) {
e.printStackTrace();
}
return sb.toString();
}
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return String.valueOf(hexChars);
}
¿Alguien sabe de una manera más rápida en Java?
Creo que la solución más fácil es usar Apache Common Codec :
String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(stringText);
Ejemplo completo hash a cadena como otra cadena.
public static String sha256(String base) {
try{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(base.getBytes("UTF-8"));
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append(''0'');
hexString.append(hex);
}
return hexString.toString();
} catch(Exception ex){
throw new RuntimeException(ex);
}
}
Puede usar MessageDigest de la siguiente manera:
public static String getSHA256(String data){
StringBuffer sb = new StringBuffer();
try{
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(data.getBytes());
byte byteData[] = md.digest();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
} catch(Exception e){
e.printStackTrace();
}
return sb.toString();
}
SHA-256 no es una "codificación", es un hash de un solo sentido.
Básicamente convertirás la cadena en bytes (por ejemplo, usando text.getBytes(StandardCharsets.UTF_8)
) y luego hash los bytes. Tenga en cuenta que el resultado del hash también sería datos binarios arbitrarios, y si desea representar eso en una cadena, debe usar base64 o hex ... no intente usar el constructor String(byte[], String)
.
p.ej
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
Si está utilizando Java 8 puede codificar el byte[]
haciendo
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = Base64.getEncoder().encodeToString(hash);
Convertir Java String a Sha-256 Hash
import java.security.MessageDigest;
public class CodeSnippets {
public static String getSha256(String value) {
try{
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(value.getBytes());
return bytesToHex(md.digest());
} catch(Exception ex){
throw new RuntimeException(ex);
}
}
private static String bytesToHex(byte[] bytes) {
StringBuffer result = new StringBuffer();
for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
return result.toString();
}
}
DigestUtils
código de Apache a través de DigestUtils
y sha256
parece regresar a java.security.MessageDigest
por java.security.MessageDigest
para el cálculo. Apache no implementa una solución sha256
independiente. Estaba buscando una implementación independiente para compararla con la biblioteca java.security
. Solo para tu información.
String hashWith256(String textToHash) {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] byteOfTextToHash = textToHash.getBytes(StandardCharsets.UTF_8);
byte[] hashedByetArray = digest.digest(byteOfTextToHash);
String encoded = Base64.encode(hashedByetArray);
return encoded;
}