如何生成 MD5 哈希?

是否有任何方法可以在 Java 中生成字符串的 MD5 哈希?

答案

MessageDigest类可以为您提供 MD5 摘要的实例。

使用字符串和 crypto 类时,请确保始终指定要使用字节表示形式的编码。如果仅使用string.getBytes() ,它将使用平台默认值。 (并非所有平台都使用相同的默认值)

import java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

如果您有大量数据,请查看可以重复调用的.update(byte[])方法。然后调用.digest()以获取结果哈希。

您需要java.security.MessageDigest

调用MessageDigest.getInstance("MD5")以获取可以使用的MessageDigest的 MD5 实例。

通过执行以下操作之一来计算哈希:

  • 将整个输入作为byte[]输入,并使用md.digest(bytes)在一次操作中计算哈希值。
  • 通过调用md.update(bytes)一次向MessageDigest一个byte[]块。添加完输入字节后,请使用md.digest()计算哈希值。

md.digest()返回的byte[]是 MD5 哈希值。

如果您实际上希望答案以字符串而不是字节数组的形式返回,则始终可以执行以下操作:

String plaintext = "your text here";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
  hashtext = "0"+hashtext;
}

您可能还需要查看 apache commons 编解码器项目的DigestUtils类,该类提供了非常方便的方法来创建 MD5 或 SHA 摘要。

发现了这一点:

public String MD5(String md5) {
   try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
          sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
       }
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {
    }
    return null;
}

在下面的网站上,我对此一无所知,但是它是可行的解决方案!对我来说,许多其他代码无法正常工作,我最终在哈希中缺少 0。这似乎与 PHP 相同。来源: http : //m2tec.be/blog/2010/02/03/java-md5-hex-0093

这是我的用法:

final MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(string.getBytes(Charset.forName("UTF8")));
final byte[] resultByte = messageDigest.digest();
final String result = new String(Hex.encodeHex(resultByte));

十六进制为: Apache Commons 项目中的 org.apache.commons.codec.binary.Hex

我刚刚下载了commons-codec.jar,并获得了像 md5 这样的完美 php。这是手册

只需将其导入您的项目并使用

String Url = "your_url";

System.out.println( DigestUtils.md5Hex( Url ) );

就在那里。

我发现这是最清晰,最简洁的方法:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));

找到了这个解决方案,该解决方案从 MD5 哈希中取回 String 表示形式要干净得多。

import java.security.*;
import java.math.*;

public class MD5 {
    public static void main(String args[]) throws Exception{
        String s="This is a test";
        MessageDigest m=MessageDigest.getInstance("MD5");
        m.update(s.getBytes(),0,s.length());
        System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));
    }
}

代码是从这里提取的。

另一种选择是使用番石榴散列方法

Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();

如果您已经在使用番石榴,则非常方便(如果没有,则应该使用)。