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í?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top