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-1
SHA-256
- 自1.1版本起:
- 1.1
- 参见:
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionclone()
如果实现可克隆,则返回克隆对象。byte[]
digest()
通过执行填充等最终操作完成哈希计算。byte[]
digest
(byte[] input) 使用指定的字节数组进行最终更新,然后完成摘要计算。int
digest
(byte[] buf, int offset, int len) 通过执行填充等最终操作完成哈希计算。final String
返回标识算法的字符串,独立于实现细节。final int
返回摘要的字节长度,如果提供程序不支持此操作且实现不可克隆,则返回0。static MessageDigest
getInstance
(String algorithm) 返回实现指定摘要算法的MessageDigest
对象。static MessageDigest
getInstance
(String algorithm, String provider) 返回实现指定摘要算法的MessageDigest
对象。static MessageDigest
getInstance
(String algorithm, Provider provider) 返回实现指定摘要算法的MessageDigest
对象。final Provider
返回此消息摘要对象的提供程序。static boolean
isEqual
(byte[] digesta, byte[] digestb) 比较两个摘要是否相等。void
reset()
重置摘要以供进一步使用。toString()
返回此消息摘要对象的字符串表示形式。void
update
(byte input) 使用指定的字节更新摘要。void
update
(byte[] input) 使用指定的字节数组更新摘要。void
update
(byte[] input, int offset, int len) 使用指定的字节数组更新摘要,从指定的偏移量开始。final void
update
(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.preferred
Security
属性来确定指定算法的首选提供程序顺序。这可能与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
的实现上调用此方法。 - 另请参阅:
-