Module java.base
Package java.security

Class MessageDigest

java.lang.Object
java.security.MessageDigestSpi
java.security.MessageDigest

public abstract class MessageDigest extends MessageDigestSpi
这个MessageDigest类提供了消息摘要算法(如SHA-1或SHA-256)的功能。消息摘要是安全的单向哈希函数,它接受任意大小的数据并输出固定长度的哈希值。

MessageDigest对象在初始化时开始。数据通过update方法进行处理。在任何时候都可以调用reset来重置摘要。一旦所有要更新的数据都已更新,应调用其中一个digest方法来完成哈希计算。

digest方法可以针对给定数量的更新调用一次。调用digest后,MessageDigest对象将重置为其初始化状态。

实现可以自由实现Cloneable接口。客户端应用程序可以通过尝试克隆并捕获CloneNotSupportedException来测试克隆性:


 MessageDigest md = MessageDigest.getInstance("SHA-256");

 try {
     md.update(toChapter1);
     MessageDigest tc1 = md.clone();
     byte[] toChapter1Digest = tc1.digest();
     md.update(toChapter2);
     ...等等。
 } catch (CloneNotSupportedException cnse) {
     throw new DigestException("无法对部分内容进行摘要");
 }
 

请注意,如果给定的实现不可克隆,则仍然可以通过实例化多个实例来计算中间摘要,如果摘要数量事先已知。

请注意,此类是抽象类,并且出于历史原因扩展自MessageDigestSpi。应用程序开发人员应仅注意此MessageDigest类中定义的方法;超类中的所有方法都是为希望提供自己的消息摘要算法实现的加密服务提供者而定义的。

Java平台的每个实现都必须支持以下标准MessageDigest算法:

  • SHA-1
  • SHA-256
这些算法在Java安全标准算法名称规范的消息摘要部分中有描述。请查阅您的实现的发布文档,以查看是否支持任何其他算法。
自1.1版本起:
1.1
参见:
  • Constructor Details

    • MessageDigest

      protected MessageDigest(String algorithm)
      使用指定的算法名称创建消息摘要。
      参数:
      algorithm - 摘要算法的标准名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的消息摘要部分。
  • Method Details

    • getInstance

      public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
      返回实现指定摘要算法的MessageDigest对象。

      此方法遍历已注册的安全提供程序列表,从最首选的提供程序开始。返回封装了支持指定算法的第一个提供程序的MessageDigestSpi实现的新MessageDigest对象。

      请注意,已注册提供程序的列表可以通过Security.getProviders()方法检索。

      实现注意:
      JDK参考实现还使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()返回的提供程序顺序不同。
      参数:
      algorithm - 请求的算法名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的消息摘要部分。
      返回:
      实现指定算法的MessageDigest对象
      抛出:
      NoSuchAlgorithmException - 如果没有提供程序支持指定算法的MessageDigestSpi实现
      NullPointerException - 如果algorithmnull
      参见:
    • getInstance

      public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
      返回实现指定摘要算法的MessageDigest对象。

      返回封装了指定提供程序的MessageDigestSpi实现的新MessageDigest对象。指定的提供程序必须在安全提供程序列表中注册。

      请注意,已注册提供程序的列表可以通过Security.getProviders()方法检索。

      参数:
      algorithm - 请求的算法名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的消息摘要部分。
      provider - 提供程序的名称。
      返回:
      实现指定算法的MessageDigest对象
      抛出:
      IllegalArgumentException - 如果提供程序名称为null或空
      NoSuchAlgorithmException - 如果指定提供程序中不可用指定算法的MessageDigestSpi实现
      NoSuchProviderException - 如果指定提供程序未在安全提供程序列表中注册
      NullPointerException - 如果algorithmnull
      参见:
    • getInstance

      public static MessageDigest getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
      返回实现指定摘要算法的MessageDigest对象。

      返回封装了指定提供程序的MessageDigestSpi实现的新MessageDigest对象。请注意,指定的提供程序不必在提供程序列表中注册。

      参数:
      algorithm - 请求的算法名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的消息摘要部分。
      provider - 提供程序。
      返回:
      实现指定算法的MessageDigest对象
      抛出:
      IllegalArgumentException - 如果指定提供程序为null
      NoSuchAlgorithmException - 如果指定Provider对象中不可用指定算法的MessageDigestSpi实现
      NullPointerException - 如果algorithmnull
      自1.4版本起:
      1.4
      参见:
    • getProvider

      public final Provider getProvider()
      返回此消息摘要对象的提供程序。
      返回:
      此消息摘要对象的提供程序
    • update

      public void update(byte input)
      使用指定的字节更新摘要。
      参数:
      input - 用于更新摘要的字节。
    • update

      public void update(byte[] input, int offset, int len)
      使用指定的字节数组更新摘要,从指定的偏移量开始。
      参数:
      input - 字节数组。
      offset - 要从字节数组中开始的偏移量。
      len - 要使用的字节数,从offset开始。
    • update

      public void update(byte[] input)
      使用指定的字节数组更新摘要。
      参数:
      input - 字节数组。
    • update

      public final void update(ByteBuffer input)
      使用指定的ByteBuffer更新摘要。使用input.remaining()字节开始于input.position()更新摘要。返回时,缓冲区的位置将等于其限制;其限制不会改变。
      参数:
      input - ByteBuffer
      自版本:
      1.5
    • digest

      public byte[] digest()
      通过执行填充等最终操作完成哈希计算。在调用此方法后,摘要将被重置。
      返回:
      结果哈希值的字节数组。
    • digest

      public int digest(byte[] buf, int offset, int len) throws DigestException
      通过执行填充等最终操作完成哈希计算。在调用此方法后,摘要将被重置。
      参数:
      buf - 用于存储计算摘要的输出缓冲区
      offset - 开始存储摘要的输出缓冲区的偏移量
      len - 用于摘要的buf中的字节数
      返回:
      存放在buf中的字节数
      抛出:
      DigestException - 如果发生错误。
    • digest

      public byte[] digest(byte[] input)
      使用指定的字节数组进行最终更新,然后完成摘要计算。即,此方法首先调用update(input),将输入数组传递给update方法,然后调用digest()
      参数:
      input - 在完成摘要之前要更新的输入。
      返回:
      结果哈希值的字节数组。
    • toString

      public String toString()
      返回此消息摘要对象的字符串表示形式。
      覆盖:
      toString 在类 Object
      返回:
      对象的字符串表示形式。
    • isEqual

      public static boolean isEqual(byte[] digesta, byte[] digestb)
      比较两个摘要是否相等。如果两个摘要具有相同的长度,并且对应位置的所有字节相等,则两个摘要相等。
      实现注意:
      检查digesta中的所有字节以确定相等性。计算时间仅取决于digesta的长度。它不取决于digestb的长度或digestadigestb的内容。
      参数:
      digesta - 要比较的摘要之一。
      digestb - 要比较的另一个摘要。
      返回:
      如果摘要相等,则返回true,否则返回false
    • reset

      public void reset()
      重置摘要以供进一步使用。
    • getAlgorithm

      public final String getAlgorithm()
      返回标识算法的字符串,独立于实现细节。名称应为标准的Java安全名称(例如"SHA-256")。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的MessageDigest部分。
      返回:
      算法的名称
    • getDigestLength

      public final int getDigestLength()
      返回摘要的字节长度,如果提供程序不支持此操作且实现不可克隆,则返回0。
      返回:
      摘要长度(以字节为单位),如果提供程序不支持此操作且实现不可克隆,则返回0。
      自版本:
      1.2
    • clone

      public Object clone() throws CloneNotSupportedException
      如果实现可克隆,则返回克隆。
      覆盖:
      clone 在类 MessageDigestSpi
      返回:
      如果实现可克隆,则返回克隆。
      抛出:
      CloneNotSupportedException - 如果在不支持Cloneable的实现上调用此方法。
      另请参阅: