概念
- 它是一個唯一對應一個消息或文本的固定長度的值,它由一個單向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();
}
}