Apache Commons Codec 库提供了 DigestUtils 工具类,该类用于简化常见 MessageDigest(消息摘要)任务的操作。 此类是不可变的并且是线程安全的。 但是,它创建的 MessageDigest 实例通常不是线程安全的。
MessageDigestAlgorithms 类为标准消息摘要算法提供常量,提供了 DigestUtils 支持的消息摘要算法名称常亮。它可与 getDigest(String) 方法和其他需要摘要算法名称的方法一起使用。源码如下:
public class MessageDigestAlgorithms { public static final String MD2 = "MD2"; public static final String MD5 = "MD5"; public static final String SHA_1 = "SHA-1"; public static final String SHA_224 = "SHA-224"; public static final String SHA_256 = "SHA-256"; public static final String SHA_384 = "SHA-384"; public static final String SHA_512 = "SHA-512"; public static final String SHA_512_224 = "SHA-512/224"; public static final String SHA_512_256 = "SHA-512/256"; public static final String SHA3_224 = "SHA3-224"; public static final String SHA3_256 = "SHA3-256"; public static final String SHA3_384 = "SHA3-384"; public static final String SHA3_512 = "SHA3-512"; }
注意:DigestUtils 工具类为 Java6 中作为标准提出的所有算法提供了便捷方法。这种方法对每个算法都需要提供很多方法,如:digestMd2(byte[] bytes), digestMd2(String str), digestMd2(File file), digestMd5(byte[] bytes), digestMd5(String str), digestMd5(File file) 等等;这样会导致工具方法急剧上升,很快就变得很笨拙。下面的 DigestUtils 代码适用于所有算法:
import static org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_224; // ... byte [] digest = new DigestUtils(SHA_224).digest(dataToDigest); String hdigest = new DigestUtils(SHA_224).digestAsHex(new File("pom.xml"));
如果算法需要改变,只需修改 new DigestUtils(SHA_256), new DigestUtils(SHA_512) 等。
DigestUtils(MessageDigest digest)
使用提供的 MessageDigest 参数创建一个实例。然后可以使用诸如 digest(byte[]) 和 digestAsHex(File)之类的方法来创建摘要。
DigestUtils(String name)
使用提供的消息摘要算法名称参数创建一个实例。然后可以使用诸如 digest(byte[]) 和 digestAsHex(File)之类的方法来创建摘要。
注意:消息摘要算法名称推荐使用 MessageDigestAlgorithms 类中提供的算法名称常亮。
DigestUtils 类提供了很多工具方法,实例方法消息摘要更创建 DigestUtils 实例指定的消息摘要算法名称相关。例如:
byte [] digest = new DigestUtils(SHA_224).digest(dataToDigest); String hdigest = new DigestUtils(SHA_224).digestAsHex(new File("pom.xml"));
上面的 digestAsHex() 方法进行的是 SHA_224 消息摘要算法。
DigestUtils 类还提供了很多静态方法,这些方法的名称命名跟具体的消息摘要算法相关。
(1)生成消息摘要的方法,重载了很多方法;它的参数可以是字节数组、字符串、文件、Buffer等。方法声明如下:
byte[] digest(byte[] data)
byte[] digest(ByteBuffer data)
byte[] digest(File data)
byte[] digest(InputStream data)
byte[] digest(Path data, OpenOption... options)
byte[] digest(String data)
其中:
Path 可用于在文件系统中定位文件的对象,它通常表示系统相关的文件路径。来自 JDK1.7
options 表示如何打开文件的选项,OpenOption 来自 JDK1.7。配置如何打开或创建文件的对象。打开或创建文件时,此类对象将由诸如 newOutputStream, newByteChannel, FileChannel.open 和 AsynchronousFileChannel.open 之类的方法使用。在 StandardOpenOption 枚举类型定义标准选项。
(2)生成消息摘要的方法,这些方法直接返回十六进制的消息摘要信息字符串。避免我们自己使用类似 Hex.encodeHexString() 方法将字节数组转换成十六进制字符串。方法声明如下:
String digestAsHex(byte[] data)
String digestAsHex(ByteBuffer data)
String digestAsHex(File data)
String digestAsHex(InputStream data)
String digestAsHex(Path data, OpenOption... options)
String digestAsHex(String data)
(3)根据给定的 MessageDigest 对象计算消息摘要信息,方法声明如下:
static byte[] digest(MessageDigest messageDigest, byte[] data)
static byte[] digest(MessageDigest messageDigest, ByteBuffer data)
static byte[] digest(MessageDigest messageDigest, File data)
static byte[] digest(MessageDigest messageDigest, InputStream data)
static byte[] digest(MessageDigest messageDigest, Path data, OpenOption... options)
static byte[] digest(MessageDigest messageDigest, RandomAccessFile data)
(4)获取当前 DigestUtils 实例中的 MessageDigest 实例对象,方法声明如下:
MessageDigest getMessageDigest()
(5)根据消息摘要算法名或者直接使用消息摘要算法相关的方法获取 MessageDigest 消息摘要对象,方法声明如下:
static MessageDigest getDigest(String algorithm)
static MessageDigest getDigest(String algorithm, MessageDigest defaultMessageDigest)
static MessageDigest getMd2Digest()
static MessageDigest getMd5Digest()
static MessageDigest getSha1Digest()
static MessageDigest getSha256Digest()
static MessageDigest getSha3_224Digest()
static MessageDigest getSha3_256Digest()
static MessageDigest getSha3_384Digest()
static MessageDigest getSha3_512Digest()
static MessageDigest getSha384Digest()
static MessageDigest getSha512_224Digest()
static MessageDigest getSha512_256Digest()
static MessageDigest getSha512Digest()
(5)验证 DigestUtils 类是否支持给定的消息摘要算法,方法声明如下:
static boolean isAvailable(String messageDigestAlgorithm)
(6)支持 MD2 消息摘要算法,方法声明如下:
static byte[] md2(byte[] data)
static byte[] md2(InputStream data)
static byte[] md2(String data)
static String md2Hex(byte[] data)
static String md2Hex(InputStream data)
static String md2Hex(String data)
(7)支持 MD5 消息摘要算法,方法声明如下:
static byte[] md5(byte[] data)
static byte[] md5(InputStream data)
static byte[] md5(String data)
static String md5Hex(byte[] data)
static String md5Hex(InputStream data)
static String md5Hex(String data)
(8)支持 SHA1 消息摘要算法,方法声明如下:
static byte[] sha1(byte[] data)
static byte[] sha1(InputStream data)
static byte[] sha1(String data)
static String sha1Hex(byte[] data)
static String sha1Hex(InputStream data)
static String sha1Hex(String data)
(9)支持 SHA256 消息摘要算法,方法声明如下:
static byte[] sha256(byte[] data)
static byte[] sha256(InputStream data)
static byte[] sha256(String data)
static String sha256Hex(byte[] data)
static String sha256Hex(InputStream data)
static String sha256Hex(String data)
(10)支持 SHA3_224 消息摘要算法,方法声明如下:
static byte[] sha3_224(byte[] data)
static byte[] sha3_224(InputStream data)
static byte[] sha3_224(String data)
static String sha3_224Hex(byte[] data)
static String sha3_224Hex(InputStream data)
static String sha3_224Hex(String data)
(11)支持 SHA3_256 消息摘要算法,方法声明如下:
static byte[] sha3_256(byte[] data)
static byte[] sha3_256(InputStream data)
static byte[] sha3_256(String data)
static String sha3_256Hex(byte[] data)
static String sha3_256Hex(InputStream data)
static String sha3_256Hex(String data)
(12)支持 SHA3_384 消息摘要算法,方法声明如下:
static byte[] sha3_384(byte[] data)
static byte[] sha3_384(InputStream data)
static byte[] sha3_384(String data)
static String sha3_384Hex(byte[] data)
static String sha3_384Hex(InputStream data)
static String sha3_384Hex(String data)
(13)支持 SHA3_512 消息摘要算法,方法声明如下:
static byte[] sha3_512(byte[] data)
static byte[] sha3_512(InputStream data)
static byte[] sha3_512(String data)
static String sha3_512Hex(byte[] data)
static String sha3_512Hex(InputStream data)
static String sha3_512Hex(String data)
(14)支持 SHA384 消息摘要算法,方法声明如下:
static byte[] sha384(byte[] data)
static byte[] sha384(InputStream data)
static byte[] sha384(String data)
static String sha384Hex(byte[] data)
static String sha384Hex(InputStream data)
static String sha384Hex(String data)
(15)支持 SHA512_224 消息摘要算法,方法声明如下:
static byte[] sha512_224(byte[] data)
static byte[] sha512_224(InputStream data)
static byte[] sha512_224(String data)
static String sha512_224Hex(byte[] data)
static String sha512_224Hex(InputStream data)
static String sha512_224Hex(String data)
(16)支持 SHA512_256 消息摘要算法,方法声明如下:
static byte[] sha512_256(byte[] data)
static byte[] sha512_256(InputStream data)
static byte[] sha512_256(String data)
static String sha512_256Hex(byte[] data)
static String sha512_256Hex(InputStream data)
static String sha512_256Hex(String data)
(17)支持 SHA512 消息摘要算法,方法声明如下:
static byte[] sha512(byte[] data)
static byte[] sha512(InputStream data)
static byte[] sha512(String data)
static String sha512Hex(byte[] data)
static String sha512Hex(InputStream data)
static String sha512Hex(String data)
(18)使用给定的 MessageDigest 对象更新消息摘要,方法声明如下:
static MessageDigest updateDigest(MessageDigest messageDigest, byte[] valueToDigest)
static MessageDigest updateDigest(MessageDigest messageDigest, ByteBuffer valueToDigest)
static MessageDigest updateDigest(MessageDigest digest, File data)
static MessageDigest updateDigest(MessageDigest digest, InputStream inputStream)
static MessageDigest updateDigest(MessageDigest digest, Path path, OpenOption... options)
static MessageDigest updateDigest(MessageDigest digest, RandomAccessFile data)
static MessageDigest updateDigest(MessageDigest messageDigest, String valueToDigest)
上面这些方法将在后续章节进行详细介绍,以及提供用法实例。