java中的数据加密1 消息摘要

时间:2022-10-25 04:33:31

消息摘要(Message Digest)

  又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。 消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。

  HASH函数的抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过哈希算法作用后都将产生不同的值。而HASH算法的单向性使得要找到哈希值相同的两个不同的输入消息,在计算上是不可能的。所以数据的哈希值,即消息摘要,可以检验数据的完整性。

  哈希函数的这种对不同的输入能够生成不同的值的特性使得无法找到两个具有相同哈希值的输入。因此,如果两个文档经哈希转换后成为相同的值,就可以肯定它们是同一文档。所以,当希望有效地比较两个数据块时,就可以比较它们的哈希值。例如,可以通过比较邮件发送前和发送后的哈希值来验证该邮件在传递时是否修改。

import java.security.MessageDigest;

public class MessageDigestTest {
public static void main(String[] args) throws Exception {
byte[] srcText = "hellokitty test MessageDigest".getBytes("UTF8");
// 使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
System.out.println(" " + messageDigest.getProvider().getInfo());
// 开始使用算法
messageDigest.update(srcText);
System.out.println(" Digest:");
// 输出算法运算结果
System.out.println(new String(messageDigest.digest(), "UTF8"));
// 同样的文本,输出同样的结果
messageDigest.update(srcText);
System.out.println(new String(messageDigest.digest(), "UTF-8"));
}
}