Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MD5数组转换为字符串java_Java_Md5 - Fatal编程技术网

将MD5数组转换为字符串java

将MD5数组转换为字符串java,java,md5,Java,Md5,我知道有很多类似的话题,但仍然。。。有人能给我一个生成MD5字符串的方法的工作示例吗。 我目前正在使用MessageDigest,我正在执行以下操作以获取字符串 sun.misc.BASE64Encoder().encode(messageDigest.digest()) 我想有更好的方法可以做到这一点。 提前谢谢 MessageDigest md = MessageDigest.getInstance("MD5"); byte[] arr = md.digest(bytesOfMessa

我知道有很多类似的话题,但仍然。。。有人能给我一个生成MD5字符串的方法的工作示例吗。
我目前正在使用MessageDigest,我正在执行以下操作以获取字符串

sun.misc.BASE64Encoder().encode(messageDigest.digest())  
我想有更好的方法可以做到这一点。
提前谢谢

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] arr = md.digest(bytesOfMessage);
return Base64.getEncoder().encodeToString(arr);
注意:MD5不再被认为是好的散列算法,考虑选择SHAs

< P>我将使用

  • Base64-
    Base64.encodeBase64(digestBytes)
  • 十六进制字符串-
    Hex.encodeHex(digestBytes)
//转换为十六进制字符串
StringBuffer sb=新的StringBuffer();
for(int i=0;i

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

我看到了下一个解决方案:

    byte[] digest = md.digest(someDataByteArray);
    StringBuilder hex = new StringBuilder();
    for (byte b : digest) {
        hex.append(String.format("%02x", b));
    }
如果您想要一个号码:

Integer number = Integer.parseInt(hex, 16); // parse hex number to integer. If overflowed, use Long.parseLong()

这是哪个BASE64Encoder类?对不起。。。。这里是import sun.misc.BASE64Encoder;我通常会避免使用sun.*类。。。请参阅对已接受答案的检查注释,显示的代码中存在错误。仅供参考:MD5是一种哈希算法,而不是密码。因此,它不加密数据。相反,它会散列数据,您不需要为了打印MD5字符串而创建BigInteger的开销。把16个字节打印成十六进制并不难。此外,您可能需要编辑源代码,正如Adam Paynter指出的那样,MD5不是加密,而是散列数据。警告-此算法有一个BUG。它将删除MD5哈希的前导0。演示:使用此算法将此(无引号)“wwq123456”散列,并使用类似这样的在线工具执行相同操作:并注意缺少的0。正确的散列是“07E1C0D9533B5168E18A99F450448AF”,但此算法给出了“7E1C0D9533B5168E18A99F450448AF”。以上答案的基本问题是,如果开始的时候出现了零,那么我认为它不适合使用!!!!由于答案已被编辑为完全不同的实现,这些评论令人困惑。DigestUtils是本页上的最佳解决方案。:)虽然使用库代码而不是编写自己的算法是很好的,但它也有一个缺点,即整个库必须包含在发行版中,这对于一种方法来说是一种耻辱。显然,如果也使用了许多其他类和方法,那么这是理想的,但通常情况下可能不是这样。Hex.encodeHex比公认的答案快得多。如果人们使用此解决方案,请提醒一句。它不允许前导零,这可能会导致散列检查。所以0x0E将被打印为E,0x00将被剥离为单个0。一个基本的解决方法是测试每个结果的长度,当长度为1时,在前面加一个零。@M如果你完全正确的话。我刚刚更新了答案。谢谢你提醒我!此方法将获得与您在*nix终端中使用
md5
程序获得的结果相同的结果,而且,非常清楚!
import javax.xml.bind.DatatypeConverter;
import java.security.MessageDigest;

...
String input = "westerngun";
MessageDigest digest = MessageDigest.getInstance("MD5"); // not thread-safe, create instance for each thread
byte[] result = digest.digest(input.getBytes()); // get MD5 hash array, could contain negative
String hex = DatatypeConverter.printHexBinary(result).toLowerCase(); // convert byte array to hex string
Integer number = Integer.parseInt(hex, 16); // parse hex number to integer. If overflowed, use Long.parseLong()