从Message Digest获取MD5字符串

时间:2011-03-29 09:11:35

标签: java md5 message digest

我理解它是如何工作的但是如果我想将MD5打印成String我该怎么做?

public static void getMD5(String fileName) throws Exception{
    InputStream input =  new FileInputStream(fileName);
    byte[] buffer = new byte[1024];

    MessageDigest hash = MessageDigest.getInstance("MD5");
    int read;
    do {
        read = input.read(buffer);
        if (read > 0) {
            hash.update(buffer, 0, read);
        }
    } while (read != -1);
    input.close();
}

11 个答案:

答案 0 :(得分:74)

你可以减少写作:

String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))

答案 1 :(得分:23)

    String input = "168";
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] md5sum = md.digest(input.getBytes());
    String output = String.format("%032X", new BigInteger(1, md5sum));

DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("a".getBytes("UTF-8")))

答案 2 :(得分:21)

试试这个

StringBuffer hexString = new StringBuffer();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest();

for (int i = 0; i < hash.length; i++) {
    if ((0xff & hash[i]) < 0x10) {
        hexString.append("0"
                + Integer.toHexString((0xFF & hash[i])));
    } else {
        hexString.append(Integer.toHexString(0xFF & hash[i]));
    }
}

答案 3 :(得分:21)

您也可以使用Apache Commons Codec库。 该库包含public static String md5Hex(InputStream data)类中的方法public static String md5Hex(byte[] data)DigestUtils。 无需自己发明;)

答案 4 :(得分:8)

首先,您需要获得byte[]的<{1}}输出:

MessageDigest

你不能轻易打印这个(例如byte[] bytes = hash.digest(); ),因为它将包含不具有良好输出表示的二进制文件。您可以将其转换为十六进制,以便显示如下:

new String(bytes)

答案 5 :(得分:3)

使用字节数组,来自消息摘要的结果:

...
byte hashgerado[] = md.digest(entrada);
...

for(byte b : hashgerado)
    System.out.printf("%02x", Byte.toUnsignedInt(b));

结果(例如):
89e8a9f68ad3c4bba9b9d3581cf5201d

答案 6 :(得分:2)

/**
 * hashes:
 * e7cfa2be5969e235138356a54bad7fc4
 * 3c9ec110aa171b57bb41fc761130822c
 *
 * compiled with java 8 - 12 Dec 2015
 */
public static String generateHash() {
    long r = new java.util.Random().nextLong();
    String input = String.valueOf(r);
    String md5 = null;

    try {
        java.security.MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
        //Update input string in message digest
        digest.update(input.getBytes(), 0, input.length());
        //Converts message digest value in base 16 (hex)
        md5 = new java.math.BigInteger(1, digest.digest()).toString(16);
    }
    catch (java.security.NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return md5;
}

答案 7 :(得分:1)

... FYI

在某些情况下,这对我不起作用

md5 = new java.math.BigInteger(1, digest.digest()).toString(16);

但这确实

StringBuilder sb = new StringBuilder();

for (int i = 0; i < digest.length; i++) {
    if ((0xff & digest[i]) < 0x10) {
        sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
    } else {
        sb.append(Integer.toHexString(0xFF & digest[i]));
    }
}

String result = sb.toString();

答案 8 :(得分:0)

最短的方式:

String toMD5(String input) {
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] raw = md.digest(input.getBytes());
    return DatatypeConverter.printHexBinary(raw);
}

请记住要处理异常。

答案 9 :(得分:-1)

致电hash.digest()完成此过程。它将返回一个字节数组。

您可以使用String构造函数从byte[]创建一个String,但是如果您想要一个十六进制字符串,则必须手动遍历字节数组并计算出字符。

答案 10 :(得分:-1)

这是@anything答案的另一个版本:

StringBuilder sb = new StringBuilder();

for (int i = 0; i < digest.length; i++) {
    if ((0xff & digest[i]) < 0x10) {
        sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
    } else {
        sb.append(Integer.toHexString(0xFF & digest[i]));
    }
}

String result = sb.toString();