2013-09-27 3 views
1

Я разрабатываю приложение для Android, а в определенной части приложения мне нужно вычислить MD5 определенной строки. Я использую следующий код, но то и выходной строки, если байт, который должен преобразовать в строку ниже, чем 10, то он пропустит 0 в представлении два байта:Проблема с MD5 MD5, отсутствующие символы

MessageDigest di = java.security.MessageDigest.getInstance("MD5"); 
    di.update(cadena.getBytes()); 
    byte mdi[] = di.digest(); 

    StringBuffer md5= new StringBuffer(); 
    for (byte b : mdi) { 
     md5.append(Integer.toHexString(0xFF & b)); 
    } 

Например, если я передаю строку 109370, то MD5 он должен будет вернуть 932ff0696b0434d7a83e1ff84fe298c5, но вместо этого он вычисляет 932ff0696b434d7a83e1ff84fe298c5.

Это потому, что массив байтов имеет 4 и Integer.toHexString() возвращает только 1 массив символов вместо двух.

Любая мысль о том, как я могу справиться с этим?

Спасибо!

ответ

0

ниже код, который я использую:

import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 


public class MD5Encode { 
    private static String convertedToHex(byte[] data) { 
    StringBuffer buf = new StringBuffer(); 

    for (int i = 0; i < data.length; i++) { 
     int halfOfByte = (data[i] >>> 4) & 0x0F; 
     int twoHalfBytes = 0; 

     do { 
      if ((0 <= halfOfByte) && (halfOfByte <= 9)) { 
       buf.append((char) ('0' + halfOfByte)); 
      } else { 
       buf.append((char) ('a' + (halfOfByte - 10))); 
      } 

      halfOfByte = data[i] & 0x0F; 

     } while (twoHalfBytes++ < 1); 
    } 
    return buf.toString(); 
    } 

    public static String MD5(String text) throws NoSuchAlgorithmException, 
     UnsupportedEncodingException { 
    MessageDigest md; 
    md = MessageDigest.getInstance("MD5"); 
    byte[] md5 = new byte[64]; 
    md.update(text.getBytes("iso-8859-1"), 0, text.length()); 
    md5 = md.digest(); 
    return convertedToHex(md5); 
    } 
} 

и использовать его таким образом:

MD5Encode.MD5("your string here") 

надеюсь, что это вам поможет :)

0

Используйте это:

public String calculateMD5(String string) { 
    StringBuilder result = new StringBuilder(); 
    try { 
     MessageDigest m = MessageDigest.getInstance("MD5"); 
     m.update(string.getBytes("UTF8")); 

     byte s[] = m.digest(); 

     for (int i = 0; i < s.length; i++) { 
      result.append(Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6)); 
     } 
    } catch (NoSuchAlgorithmException e) { 
     throw new IllegalStateException("Password hash is unsupported by device android implementation.", e); 
    } catch (UnsupportedEncodingException e) { 
     throw new IllegalStateException("Password hash is unsupported by device android implementation.", e); 
    } 
    return result.toString(); 
} 
+0

Спасибо за пример, я думаю, что это плохо объяснено в функции docstring. Но фрагмент, который вы отправили, кажется, работает нормально. Таким образом, для этого невозможно использовать пользовательский funciton. – pablora

2

Вы можете использовать java.util.Formatter:

Formatter fmt = new Formatter(md5); 
    for (byte b : mdi) { 
     fmt.format("%02x", b&0xff); 
    } 
    fmt.close(); 
Смежные вопросы