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-1SHA-256
- 自从:
- 1.1
- 参见:
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述clone()如果实现是可克隆的,则返回一个克隆。byte[]digest()通过执行填充等最终操作来完成哈希计算。byte[]digest(byte[] input) 使用指定的字节数组对摘要执行最终更新,然后完成摘要计算。intdigest(byte[] buf, int offset, int len) 通过执行填充等最终操作来完成哈希计算。final String返回一个标识算法的字符串,独立于实现细节。final int返回摘要的长度(以字节为单位),如果提供者不支持此操作且实现不可克隆,则返回 0。static MessageDigestgetInstance(String algorithm) 返回一个实现指定摘要算法的MessageDigest对象。static MessageDigestgetInstance(String algorithm, String provider) 返回一个实现指定摘要算法的MessageDigest对象。static MessageDigestgetInstance(String algorithm, Provider provider) 返回一个实现指定摘要算法的MessageDigest对象。final Provider返回此消息摘要对象的提供者。static booleanisEqual(byte[] digesta, byte[] digestb) 比较两个摘要是否相等。voidreset()重置摘要以供进一步使用。toString()返回此消息摘要对象的字符串表示形式。voidupdate(byte input) 使用指定字节更新摘要。voidupdate(byte[] input) 使用指定的字节数组更新摘要。voidupdate(byte[] input, int offset, int len) 从指定的偏移量开始,使用指定的字节数组更新摘要。final voidupdate(ByteBuffer input) 使用指定的 ByteBuffer 更新摘要。在类 java.security.MessageDigestSpi 中声明的方法
engineDigest, engineDigest, engineGetDigestLength, engineReset, engineUpdate, engineUpdate, engineUpdate
-
构造方法详细信息
-
MessageDigest
创建具有指定算法名称的消息摘要。- 参数:
algorithm- 摘要算法的标准名称。有关标准算法名称的信息,请参阅 Java 安全标准算法名称规范 中的 MessageDigest 部分。
-
-
方法详情
-
getInstance
返回一个实现指定摘要算法的MessageDigest对象。此方法遍历已注册的安全提供者列表,从最喜欢的提供者开始。返回一个新的
MessageDigest对象,该对象封装了来自支持指定算法的第一个提供者的MessageDigestSpi实现。请注意,可以通过
Security.getProviders()方法检索已注册提供商的列表。- 实现注意事项:
-
JDK 参考实现还使用
jdk.security.provider.preferredSecurity属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()返回的提供商顺序不同。 - 参数:
algorithm- 请求的算法名称。有关标准算法名称的信息,请参阅 Java 安全标准算法名称规范 中的 MessageDigest 部分。- 返回:
-
实现指定算法的
MessageDigest对象 - 抛出:
NoSuchAlgorithmException- 如果没有Provider支持指定算法的MessageDigestSpi实现NullPointerException- 如果algorithm是null- 参见:
-
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- 如果algorithm是null- 参见:
-
getInstance
public static MessageDigest getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException 返回一个实现指定摘要算法的MessageDigest对象。返回一个新的
MessageDigest对象,其中封装了来自指定提供程序的MessageDigestSpi实现。请注意,指定的提供者不必在提供者列表中注册。- 参数:
algorithm- 请求的算法名称。有关标准算法名称的信息,请参阅 Java 安全标准算法名称规范 中的 MessageDigest 部分。provider- 提供商。- 返回:
-
实现指定算法的
MessageDigest对象 - 抛出:
IllegalArgumentException- 如果指定的提供者是nullNoSuchAlgorithmException- 如果无法从指定的Provider对象获得指定算法的MessageDigestSpi实现NullPointerException- 如果algorithm是null- 自从:
- 1.4
- 参见:
-
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
使用指定的 ByteBuffer 更新摘要。使用从input.position()开始的input.remaining()字节更新摘要。返回时,缓冲区的位置将等于其限制;它的限制不会改变。- 参数:
input- 字节缓冲区- 自从:
- 1.5
-
digest
public byte[] digest()通过执行填充等最终操作来完成哈希计算。进行此调用后将重置摘要。- 返回:
- 生成的哈希值的字节数组。
-
digest
通过执行填充等最终操作来完成哈希计算。进行此调用后将重置摘要。- 参数:
buf- 计算摘要的输出缓冲区offset- 输出缓冲区中的偏移量以开始存储摘要len- buf 中分配给摘要的字节数- 返回:
-
放入
buf的字节数 - 抛出:
DigestException- 如果发生错误。
-
digest
public byte[] digest(byte[] input) - 参数:
input- 在摘要完成之前要更新的输入。- 返回:
- 生成的哈希值的字节数组。
-
toString
返回此消息摘要对象的字符串表示形式。 -
isEqual
public static boolean isEqual(byte[] digesta, byte[] digestb) 比较两个摘要是否相等。如果两个摘要具有相同的长度并且相应位置的所有字节都相等,则它们是相等的。- 实现注意事项:
-
检查
digesta中的所有字节以确定是否相等。计算时间仅取决于digesta的长度。它不依赖于digestb的长度或digesta和digestb的内容。 - 参数:
digesta- 要比较的摘要之一。digestb- 要比较的其他摘要。- 返回:
true如果摘要相等,false否则。
-
reset
public void reset()重置摘要以供进一步使用。 -
getAlgorithm
返回一个标识算法的字符串,独立于实现细节。该名称应该是标准的 Java 安全名称(例如“SHA-256”)。有关标准算法名称的信息,请参阅 Java 安全标准算法名称规范 中的 MessageDigest 部分。- 返回:
- 算法名称
-
getDigestLength
public final int getDigestLength()返回摘要的长度(以字节为单位),如果提供者不支持此操作且实现不可克隆,则返回 0。- 返回:
- 以字节为单位的摘要长度,如果提供者不支持此操作并且实现不可克隆,则为 0。
- 自从:
- 1.2
-
clone
如果实现是可克隆的,则返回一个克隆。- 重写:
clone在类MessageDigestSpi中- 返回:
- 如果实现是可克隆的,则为克隆。
- 抛出:
CloneNotSupportedException- 如果在不支持Cloneable的实现上调用它。- 参见:
-