Module  java.base
软件包  java.security

Class 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"); 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算法:

    • MD5
    • SHA-1
    • SHA-256
    这些算法在Java Security Standard算法名称规范的MessageDigest section中进行了描述。 请参阅发行说明文件以了解是否支持其他算法。
    从以下版本开始:
    1.1
    另请参见:
    DigestInputStreamDigestOutputStream
    • 方法详细信息

      • getInstance

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

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

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

        Implementation Note:
        JDK参考实现另外使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供者顺序。 这可能与Security.getProviders()返回的提供商的顺序不同。
        参数
        algorithm - 请求的算法的名称。 有关标准算法名称的信息,请参阅Java Security Standard Algorithm Names Specification中的MessageDigest部分。
        结果
        一个实现指定算法的 MessageDigest对象
        异常
        NoSuchAlgorithmException - 如果没有 Provider支持指定算法的 MessageDigestSpi实现
        NullPointerException - 如果 algorithmnull
        另请参见:
        Provider
      • 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​()
        返回此消息摘要对象的字符串表示形式。
        重写:
        toStringObject
        结果
        对象的字符串表示形式。
      • isEqual

        public static boolean isEqual​(byte[] digesta,
                                      byte[] digestb)
        比较两个平等的消息。 如果两个摘要具有相同的长度,并且相应位置的所有字节相等,则两个摘要相等。
        Implementation Note:
        如果摘要长度相同,则会检查所有字节以确定相等。
        参数
        digesta - 一个比较的摘要。
        digestb - 其他摘要比较。
        结果
        如果摘要相等,则为true,否则为false。
      • reset

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

        public final String getAlgorithm​()
        返回一个标识算法的字符串,与实现细节无关。 该名称应该是标准的Java安全名称(如“SHA”,“MD5”等)。 有关标准算法名称的信息,请参阅Java Security Standard Algorithm Names Specification中的MessageDigest部分。
        结果
        算法的名称
      • getDigestLength

        public final int getDigestLength​()
        以字节为单位返回摘要的长度,如果提供程序不支持此操作,并且实现不可克隆,则返回0。
        结果
        摘要长度(以字节为单位),如果此操作不受提供程序支持,则执行不可克隆。
        从以下版本开始:
        1.2