messagedigest desencriptar decrypt algoritmo java php android digest sha

java - desencriptar - ¿Cómo puedo calcular el hash SHA-256 de una cadena en Android?



sha256 android (2)

Estoy tratando de obtener el SHA256 de una cadena en Android.

Aquí está el código PHP que quiero hacer coincidir:

echo bin2hex(mhash(MHASH_SHA256,"asdf")); //outputs "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b"

Ahora, en Java, estoy tratando de hacer lo siguiente:

String password="asdf" MessageDigest digest=null; try { digest = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } digest.reset(); try { Log.i("Eamorr",digest.digest(password.getBytes("UTF-8")).toString()); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }

Pero esto imprime: "a42yzk3axdv3k4yh98g8"

¿Qué hice mal aquí?

Solución gracias a erickson:

Log.i("Eamorr",bin2hex(getHash("asdf"))); public byte[] getHash(String password) { MessageDigest digest=null; try { digest = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } digest.reset(); return digest.digest(password.getBytes()); } static String bin2hex(byte[] data) { return String.format("%0" + (data.length*2) + "X", new BigInteger(1, data)); }


Estás en la línea correcta, pero convertir los bytes es un poco más complicado. Esto funciona en mi dispositivo:

// utility function private static String bytesToHexString(byte[] bytes) { // http://.com/questions/332079 StringBuffer sb = new StringBuffer(); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(0xFF & bytes[i]); if (hex.length() == 1) { sb.append(''0''); } sb.append(hex); } return sb.toString(); } // generate a hash String password="asdf"; MessageDigest digest=null; String hash; try { digest = MessageDigest.getInstance("SHA-256"); digest.update(password.getBytes()); hash = bytesToHexString(digest.digest()); Log.i("Eamorr", "result is " + hash); } catch (NoSuchAlgorithmException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }

Fuente: la función bytesToHexString es del proyecto IOSched .


La función de PHP bin2hex significa que toma una cadena de bytes y la codifica como un número hexadecimal.

En el código Java, está intentando tomar un grupo de bytes aleatorios y decodificarlos como una cadena usando la codificación de caracteres predeterminada de su plataforma. Eso no va a funcionar, y si lo hiciera, no produciría los mismos resultados.

Aquí hay una conversión binario-hexadecimal rápida y sucia para Java:

static String bin2hex(byte[] data) { StringBuilder hex = new StringBuilder(data.length * 2); for (byte b : data) hex.append(String.format("%02x", b & 0xFF)); return hex.toString(); }

Esto es rápido de escribir , no necesariamente rápido de ejecutar. Si está haciendo muchos de estos, debe reescribir la función con una implementación más rápida.