java.lang.Object
java.security.MessageDigestSpi
java.security.MessageDigest
这个
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-1SHA-256
- 自1.1版本起:
- 1.1
- 参见:
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionclone()如果实现可克隆,则返回克隆对象。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更新摘要。Methods declared in class java.security.MessageDigestSpi
engineDigest, engineDigest, engineGetDigestLength, engineReset, engineUpdate, engineUpdate, engineUpdate
-
Constructor Details
-
MessageDigest
使用指定的算法名称创建消息摘要。- 参数:
-
algorithm- 摘要算法的标准名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的消息摘要部分。
-
-
Method Details
-
getInstance
返回实现指定摘要算法的MessageDigest对象。此方法遍历已注册的安全提供程序列表,从最首选的提供程序开始。返回封装了支持指定算法的第一个提供程序的
MessageDigestSpi实现的新MessageDigest对象。请注意,已注册提供程序的列表可以通过
Security.getProviders()方法检索。- 实现注意:
-
JDK参考实现还使用
jdk.security.provider.preferredSecurity属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()返回的提供程序顺序不同。 - 参数:
-
algorithm- 请求的算法名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的消息摘要部分。 - 返回:
-
实现指定算法的
MessageDigest对象 - 抛出:
-
NoSuchAlgorithmException- 如果没有提供程序支持指定算法的MessageDigestSpi实现 -
NullPointerException- 如果algorithm为null - 参见:
-
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- 如果algorithm为null - 参见:
-
getInstance
public static MessageDigest getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException 返回实现指定摘要算法的MessageDigest对象。返回封装了指定提供程序的
MessageDigestSpi实现的新MessageDigest对象。请注意,指定的提供程序不必在提供程序列表中注册。- 参数:
-
algorithm- 请求的算法名称。有关标准算法名称的信息,请参阅Java安全标准算法名称规范中的消息摘要部分。 -
provider- 提供程序。 - 返回:
-
实现指定算法的
MessageDigest对象 - 抛出:
-
IllegalArgumentException- 如果指定提供程序为null -
NoSuchAlgorithmException- 如果指定Provider对象中不可用指定算法的MessageDigestSpi实现 -
NullPointerException- 如果algorithm为null - 自1.4版本起:
- 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.remaining()字节开始于input.position()更新摘要。返回时,缓冲区的位置将等于其限制;其限制不会改变。- 参数:
-
input- ByteBuffer - 自版本:
- 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的实现上调用此方法。 - 另请参阅:
-