Hash String a través de SHA-256 en Java

Al mirar por aquí y por Internet en general, encontré Bouncy Castle . Quiero usar Bouncy Castle (o alguna otra utilidad disponible gratuitamente) para generar un SHA-256 Hash of a String en Java. Al mirar su documentación, parece que no puedo encontrar ningún buen ejemplo de lo que quiero hacer. ¿Puede alguien aquí ayudarme?

Para hash una cadena, utiliza la clase MessageDigest incorporada:

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, el digest contiene la cadena hash y el hex contiene una cadena ASCII hexadecimal con relleno de cero a la izquierda.

Esto ya está implementado 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 JEE6 + también se podría usar JAXB DataTypeConverter :

 import javax.xml.bind.DatatypeConverter; String hash = DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8"))); 

No necesariamente necesita la biblioteca BouncyCastle. El siguiente código muestra cómo hacerlo usando 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); } } 

Un agradecimiento especial para user1452273 de esta publicación: ¿Cómo hash string con sha256 en Java?

Sigan con el buen trabajo!

Cuando se utilizan códigos hash con cualquier proveedor de jce, primero intenta obtener una instancia del algoritmo, luego la actualiza con los datos que desea codificar y, cuando termina, llama a resumen para obtener el valor hash.

 MessageDigest sha = MessageDigest.getInstance("SHA-256"); sha.update(in.getBytes()); byte[] digest = sha.digest(); 

puede usar el resumen para obtener una versión codificada en base64 o hexadecimal según sus necesidades

Java 8: Base64 disponible:

  MessageDigest md = MessageDigest.getInstance( "SHA-512" ); md.update( inbytes ); byte[] aMessageDigest = md.digest(); String outEncoded = Base64.getEncoder().encodeToString( aMessageDigest ); return( outEncoded ); 

Supongo que estás usando una versión Java relativamente antigua sin SHA-256. Por lo tanto, debe agregar el Proveedor de BouncyCastle a los ‘Proveedores de seguridad’ ya provistos 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 funcionará con el paquete siguiente “org.bouncycastle.util.encoders.Hex”

 return new String(Hex.encode(digest)); 

Es en el recipiente de Bouncycastle.