模块 java.base

类 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);
   ...etc.
 } catch (CloneNotSupportedException cnse) {
   throw new DigestException("couldn't make digest of partial content");
 }
  

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

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

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

  • SHA-1
  • SHA-256
这些算法在 Java 安全标准算法名称规范的 消息摘要部分 中进行了描述。请查阅您的实施的发布文档以查看是否支持任何其他算法。
自从:
1.1
参见:
  • 构造方法详细信息

    • MessageDigest

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

    • getInstance

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

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

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

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

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

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

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

      参数:
      algorithm - 请求的算法名称。有关标准算法名称的信息,请参阅 Java 安全标准算法名称规范 中的 MessageDigest 部分。
      provider - 提供商的名称。
      返回:
      实现指定算法的 MessageDigest 对象
      抛出:
      IllegalArgumentException - 如果提供商名称为 null 或为空
      NoSuchAlgorithmException - 如果指定算法的 MessageDigestSpi 实现无法从指定提供者处获得
      NoSuchProviderException - 如果指定的提供者没有在安全提供者列表中注册
      NullPointerException - 如果 algorithmnull
      参见:
    • getInstance

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

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

      参数:
      algorithm - 请求的算法名称。有关标准算法名称的信息,请参阅 Java 安全标准算法名称规范 中的 MessageDigest 部分。
      provider - 提供商。
      返回:
      实现指定算法的 MessageDigest 对象
      抛出:
      IllegalArgumentException - 如果指定的提供者是 null
      NoSuchAlgorithmException - 如果无法从指定的 Provider 对象获得指定算法的 MessageDigestSpi 实现
      NullPointerException - 如果 algorithmnull
      自从:
      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.position() 开始的 input.remaining() 字节更新摘要。返回时,缓冲区的位置将等于其限制;它的限制不会改变。
      参数:
      input - 字节缓冲区
      自从:
      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 的实现上调用它。
      参见: