Android MD5问题计算MD5,缺少字符

时间:2013-09-27 14:37:07

标签: java android md5

我一直在开发Android应用程序,在应用程序的某些部分,我需要计算某个字符串的MD5。我一直在使用下面的代码,但不时的输出字符串,如果它必须转换为字符串的字节小于10,那么它将在两个字节表示中错过0:

    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个char数组而不是2个。

有关如何处理此事的想法?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用java.util.Formatter:

    Formatter fmt = new Formatter(md5);
    for (byte b : mdi) {
        fmt.format("%02x", b&0xff);
    }
    fmt.close();

答案 1 :(得分:2)

下面是我正在使用的代码:

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")

希望这会对你有所帮助:)。

答案 2 :(得分: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();
}