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


当前回答

Spring中也有一个DigestUtils类:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html

这个类包含md5DigestAsHex()方法来完成这项工作。

其他回答

Bombe的答案是正确的,但请注意,除非你绝对必须使用MD5(例如,为了互操作性而被迫使用),否则更好的选择是SHA1,因为MD5长期使用有缺点。

我应该补充一点,SHA1也有理论上的漏洞,但没有那么严重。目前的哈希技术水平是,有许多候选替换哈希函数,但还没有一个成为取代SHA1的标准最佳实践。因此,根据您的需要,建议您使您的哈希算法可配置,以便将来可以替换它。

你需要java.security. messagdigest。

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

计算哈希的方法是:

以字节[]的形式提供整个输入,并使用md.digest(字节)在一次操作中计算哈希。 通过调用md.update(bytes)每次向MessageDigest提供一个字节[]块。当您完成添加输入字节时,计算与的散列 md.digest()。

md.digest()返回的字节[]是MD5散列。

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

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

如果你不需要最好的安全性,MD5是完全可以的,如果你正在做一些像检查文件完整性这样的事情,那么安全性就不是一个考虑因素。在这种情况下,您可能希望考虑一些更简单和更快的方法,例如Adler32, Java库也支持它。

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

当使用字符串和加密类时,请确保始终指定您希望字节表示的编码。如果只使用string.getBytes(),它将使用平台默认值。(并非所有平台都使用相同的默认值)

import java.security.*;

..

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

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

如果你有很多数据,看看.update(xxx)方法,它可以被重复调用。然后调用.digest()来获得结果散列。