Cómo hash una cadena en Android?

Estoy trabajando en una aplicación de Android y tengo un par de cadenas que me gustaría cifrar antes de enviar a una base de datos. Me gustaría que algo que sea seguro, fácil de implementar, genere lo mismo cada vez que se pasan los mismos datos, y preferiblemente resultará en una cadena que permanece una longitud constante sin importar cuán grande sea la cadena que se pasa a ella. Tal vez estoy buscando un hash.

Este fragmento calcula md5 para cualquier cadena dada

public String md5(String s) { try { // Create MD5 Hash MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(s.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); for (int i=0; i<messageDigest.length; i++) hexString.append(Integer.toHexString(0xFF & messageDigest[i])); return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } 

Fuente: http://www.androidsnippets.com/snippets/52/index.html

Espero que esto sea útil para usted

Esa función arriba de ( http://www.androidsnippets.org/snippets/52/index.html ) es defectuosa. Si uno de los dígitos del mensaje no es un valor hexadecimal de dos caracteres (es decir, 0x09), no funciona correctamente, ya que no pad con un 0. Si usted busca a través de usted encontrará esa función y las quejas sobre el mismo no funciona. Aquí se encuentra una mejor en la sección de comentarios de esta página , la cual modifiqué ligeramente:

 public static String md5(String s) { MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); digest.update(s.getBytes(Charset.forName("US-ASCII")),0,s.length()); byte[] magnitude = digest.digest(); BigInteger bi = new BigInteger(1, magnitude); String hash = String.format("%0" + (magnitude.length << 1) + "x", bi); return hash; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } 

No funciona método:

 public static String md5(String s) { try { // Create MD5 Hash MessageDigest digest = java.security.MessageDigest .getInstance("MD5"); digest.update(s.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); for (int i = 0; i < messageDigest.length; i++) hexString.append(Integer.toHexString(0xFF & messageDigest[i])); return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } 

Resultado – 1865e62e7129927f6e4cd9bff104f0 (longitud 30)

método de trabajo:

 public static final String md5(final String toEncrypt) { try { final MessageDigest digest = MessageDigest.getInstance("md5"); digest.update(toEncrypt.getBytes()); final byte[] bytes = digest.digest(); final StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { sb.append(String.format("%02X", bytes[i])); } return sb.toString().toLowerCase(); } catch (Exception exc) { return ""; // Impossibru! } } 

Resultado – 1865e62e7129927f6e4c0d9bff1004f0 (longitud 32)

 private static char[] hextable = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; public static String byteArrayToHex(byte[] array) { String s = ""; for (int i = 0; i < array.length; ++i) { int di = (array[i] + 256) & 0xFF; // Make it unsigned s = s + hextable[(di >> 4) & 0xF] + hextable[di & 0xF]; } return s; } public static String digest(String s, String algorithm) { MessageDigest m = null; try { m = MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return s; } m.update(s.getBytes(), 0, s.length()); return byteArrayToHex(m.digest()); } public static String md5(String s) { return digest(s, "MD5"); } 

La respuesta anterior es casi 100% correcta. Se producirá un error con unicode.

  MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); byte utf8_bytes[] = tag_xml.getBytes(); digest.update(utf8_bytes,0,utf8_bytes.length); hash = new BigInteger(1, digest.digest()).toString(16); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } 

Necesita la longitud de la matriz de bytes no la cadena.

Con la solución @Donut, con caracteres codificados UTF-8 (por ejemplo: é), debe utilizar getBytes("UTF-8") . Aquí está mi corrección del método digest:

 private static char[] hextable = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; public static String byteArrayToHex(byte[] array) { String s = ""; for (int i = 0; i < array.length; ++i) { int di = (array[i] + 256) & 0xFF; // Make it unsigned s = s + hextable[(di >> 4) & 0xF] + hextable[di & 0xF]; } return s; } public static String digest(String s, String algorithm) { MessageDigest m = null; try { m = MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return s; } try { m.update(s.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); m.update(s.getBytes()); } return byteArrayToHex(m.digest()); } public static String md5(String s) { return digest(s, "MD5"); } 

La solución de Donut en una sola función:

 private static char[] hextable = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; private static String md5(String s) { MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); digest.update(s.getBytes(), 0, s.length()); byte[] bytes = digest.digest(); String hash = ""; for (int i = 0; i < bytes.length; ++i) { int di = (bytes[i] + 256) & 0xFF; hash = hash + hextable[(di >> 4) & 0xF] + hextable[di & 0xF]; } return hash; } catch (NoSuchAlgorithmException e) { } return ""; } 
 MessageDigest md = MessageDigest.getInstance("MD5"); md.update('yourstring'); byte[] digest = md.digest(); StringBuffer sb = new StringBuffer(); for (byte b : digest) { sb.append(String.format("%02x", (0xFF & b))); } 

Es tarde para el autor, pero antes de esto, obtengo Integer.toHexString(0xff&b) , que elimina los 0s principales de la cadena hexadecimal. Me hace luchar durante mucho tiempo. Espero que sea útil para algunos chicos.

Lo siguiente funcionó para mí en Android sin truncar ningún infront de 0:

 MessageDigest md = null; String digest = null; try { md = MessageDigest.getInstance("MD5"); byte[] hash = md.digest(myStringToEncode.getBytes("UTF-8")); //converting byte array to Hexadecimal String StringBuilder sb = new StringBuilder(2*hash.length); for(byte b : hash){ sb.append(String.format("%02x", b&0xff)); } digest = sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return digest; 

Si está usando la guayaba:

 public String generateMd5(String input) { HashFunction hf = Hashing.md5(); Hasher hasher = hf.newHasher(); HashCode hc = hasher.putString(input, StandardCharsets.UTF_8).hash(); return hc.toString(); } 

Si usted no tenía restricciones de seguridad y sólo quería convertir String a un int único. Lo estoy escribiendo porque eso es lo que busqué y alcancé aquí.

 String my_key int my_key.hashCode() 

Si usted tiene hasta 10 caracteres que incluso será único Vea también https://stackoverflow.com/a/17583653/1984636

Esto no falta '0'

  public static String md5(String string) { if (TextUtils.isEmpty(string)) { return ""; } MessageDigest md5 = null; try { md5 = MessageDigest.getInstance("MD5"); byte[] bytes = md5.digest(string.getBytes()); String result = ""; for (byte b : bytes) { String temp = Integer.toHexString(b & 0xff); if (temp.length() == 1) { temp = "0" + temp; } result += temp; } return result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } 
  • UnsupportedOperationException con ArrayAdapter.remove
  • Dibujar diagrama de objetos múltiples en fragmento
  • NullPointerException aleatorio en Google Maps API v2
  • Pasar una matriz de Mats a código nativo
  • Cómo crear una biblioteca de Android desde el código que tienen gradle dependencia?
  • Android, subir una foto para alojar en imgur programatically
  • Uso de sendBroadcast ()
  • ¿Qué tan confiable flush stream de socket () es?
  • Obtener Elementos de JSON Array Android
  • ¿Cuál es el número de línea promedio por método / clase?
  • ¿Cómo rastrear el campo que está causando NullPointerException al insertar un campo personalizado en la tabla de datos de contactos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.