将MD5数组转换为String java

And*_*rew 13 java md5

我知道有很多类似的主题,但仍然......有人能为我提供生成MD5字符串的方法的工作示例.
我正在使用MessageDigest,我正在执行以下操作来获取字符串

sun.misc.BASE64Encoder().encode(messageDigest.digest())  
Run Code Online (Sandbox Code Playgroud)

我想有更好的方法可以做到这一点.
提前致谢!

Boz*_*zho 16

我会使用commons-codec

  • Base64 - Base64.encodeBase64(digestBytes)
  • 六角形 - Hex.encodeHex(digestBytes)

  • org.apache.commons.codec.digest.DigestUtils (4认同)

Jig*_*shi 12

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] arr = md.digest(bytesOfMessage);
return Base64.getEncoder().encodeToString(arr);
Run Code Online (Sandbox Code Playgroud)

注意:md5不再被认为是好的哈希算法,考虑选择SHA

  • 警告 - 这个算法有一个BUG.它将丢弃MD5哈希的前导0.为了演示:使用此算法对此进行散列(无引号)"wwq123456",并使用如下在线工具执行相同的操作:http://www.miraclesalad.com/webtools/md5.php并注意缺少的0.适当的散列是"07e1c0d9533b5168e18a99f4540448af",但是该算法给出了"7e1c0d9533b5168e18a99f4540448af".哎呀. (40认同)
  • 仅供参考:MD5是一种散列算法,而不是密码.因此,它不会*加密*数据.相反,它*哈希*数据. (17认同)
  • 现在,这些评论令人困惑,因为答案已被编辑为完全不同的实现。 (2认同)

Gro*_*uez 5

// Convert to hex string
StringBuffer sb = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++) {
    if ((0xff & messageDigest[i]) < 0x10) {
        sb.append('0');
    }
    sb.append(Integer.toHexString(0xff & messageDigest[i]));
}
String md5 = sb.toString();
Run Code Online (Sandbox Code Playgroud)

这假设您实际上希望将 MD5 打印为十六进制字符串,而不是 BASE64 编码。这就是它通常的表示方式。