概念
- 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。
- 如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。
- 消息摘要采用单向Hash 函数将需加密的明文”摘要”成一串密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是”真身”的”指纹”了
- 摘要的目的:防止报文被篡改,并且验证消息交互方的身份
- 摘要是单向加密
算法
MD5
SHA1
生成摘要
- 代码示例 类:Digest
MD5
/**
* 纯算法摘要 。 拼接上约定密钥。
*/
public void digest() {
try {
// 加上约定的密钥进行摘要
byte[] plain = plaintext.getBytes("UTF-8");
// 1、获取实例,指定算法
MessageDigest md = MessageDigest.getInstance(algorithmMD5);
// MessageDigest md = MessageDigest.getInstance(algorithmSHA);
// 2、摘要
md.update(plain);
byte[] digest = md.digest();
// byte[] digest = md.digest(plain);
// 由于摘要hash算法是对字节二进制进行散列的,所以直接转成string是会出现乱码。要么转成Base64码,也可以转成16进制码显示
// String digestText = BytesHexConverter.bytesToHexString(digest);
String digestText = Base64.encode(digest);
System.out.println(digestText);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
SHA1
public void digest() {
try {
// 加上约定的密钥进行摘要
byte[] plain = plaintext.getBytes("UTF-8");
// 1、获取实例,指定算法
// MessageDigest md = MessageDigest.getInstance(algorithmMD5);
MessageDigest md = MessageDigest.getInstance(algorithmSHA);
// 2、摘要
md.update(plain);
byte[] digest = md.digest();
// byte[] digest = md.digest(plain);
// 由于摘要hash算法是对字节二进制进行散列的,所以直接转成string是会出现乱码。要么转成Base64码,也可以转成16进制码显示
// String digestText = BytesHexConverter.bytesToHexString(digest);
String digestText = Base64.encode(digest);
System.out.println(digestText);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}