Cadena de hash SHA-256 a través de Java
-
29-09-2019 - |
Pregunta
Al mirar por aquí, así como el Internet en general, he encontrado Castillo Hinchable . Quiero usar Castillo Hinchable (o alguna otra utilidad de libre) para generar un hash SHA-256 de una cadena en Java. En cuanto a su documentación Me parece que no puede encontrar ejemplos buenos de lo que yo quiero hacer. ¿Alguien puede ayudarme aquí?
Solución
Para hash de una cadena, utilice la incorporada en el MessageDigest clase :
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.nio.charset.StandardCharsets;
import java.math.BigInteger;
public class CryptoHash {
public static void main(String[] args) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "Text to hash, cryptographically.";
// Change this to UTF-16 if needed
md.update(text.getBytes(StandardCharsets.UTF_8));
byte[] digest = md.digest();
String hex = String.format("%064x", new BigInteger(1, digest));
System.out.println(hex);
}
}
En el fragmento anterior, digest
contiene la cadena de hash y hex
contiene una cadena hexadecimal ASCII con relleno de ceros a la izquierda.
Otros consejos
Esto ya se implementa en las bibliotecas de tiempo de ejecución.
public static String calc(InputStream is) {
String output;
int read;
byte[] buffer = new byte[8192];
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
while ((read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
byte[] hash = digest.digest();
BigInteger bigInt = new BigInteger(1, hash);
output = bigInt.toString(16);
while ( output.length() < 32 ) {
output = "0"+output;
}
}
catch (Exception e) {
e.printStackTrace(System.err);
return null;
}
return output;
}
En un entorno de uno JEE6 + podría también utilizar JAXB DataTypeConverter :
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
Usted no necesariamente necesita la biblioteca BouncyCastle. El código siguiente muestra cómo hacerlo a través de la función Integer.toHexString
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);
}
}
Gracias especiales a user1452273 de este mensaje: Cómo hash de una cuerda con sha256 en Java?
Mantener el trabajo bueno!
Cuando se utiliza hashcodes con cualquier proveedor de JCE que primero trate de obtener una instancia del algoritmo, a continuación, actualizar con los datos que desea que se hash y cuando haya terminado de digerir que llamar para obtener el valor de hash.
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(in.getBytes());
byte[] digest = sha.digest();
puede utilizar el producto de digestión para obtener una versión de base 64 o hexadecimal codificado de acuerdo a sus necesidades
Java 8: Base 64 disponibles:
MessageDigest md = MessageDigest.getInstance( "SHA-512" );
md.update( inbytes );
byte[] aMessageDigest = md.digest();
String outEncoded = Base64.getEncoder().encodeToString( aMessageDigest );
return( outEncoded );
supongo que está utilizando una versión relativamente antigua de Java sin SHA-256. Lo que debe agregar el proveedor BouncyCastle a los ya previstos '' Proveedores de seguridad en su versión de Java.
// NEEDED if you are using a Java version without SHA-256
Security.addProvider(new BouncyCastleProvider());
// then go as usual
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "my string...";
md.update(text.getBytes("UTF-8")); // or UTF-16 if needed
byte[] digest = md.digest();
return new String(Hex.encode(digest));
Esto funciona con "org.bouncycastle.util.encoders.Hex" siguiente paquete
return new String(Hex.encode(digest));
Su en tarro BouncyCastle.