DigestUtils 类

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)

上面这些方法将在后续章节进行详细介绍,以及提供用法实例。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号