簡介
消息摘要算法的主要特徵是加密過程不需要密鑰,並且經過加密的數據無法被解密,即單向加密,只有輸入相同的明文數據經過相同的消息摘要算法才能得到相同的密文。
消息摘要算法不存在密鑰的管理與分發問題,適合於分佈式網絡上使用。由於其加密計算的工作量相當巨大,所以以前的這種算法通常只用於數據量有限的情況下的加密,例如計算機的口令就是用不可逆加密算法加密的
用途
一般地,把對一個信息的摘要稱爲該消息的指紋或數字簽名,數字簽名是保證信息的完整性和不可否認性的方法。消息摘要算法適合作爲數字簽名算法,也是數字簽名的核心算法。
分類
MD(Message Digest,消息摘要)
SHA(Secure Hash Algorithm,安全散列算法)
MAC(Message Authentication Code,消息認證碼)
……
MD
MD算法包括MD2、MD4和MD5,摘要長度都是128位,都是單向加密,其中JDK自帶MD2和MD5。
MD5的 java 實現
public class MyMD5 {
public static void main(String[] args) {
String str = "i am guo feng";
try {
//獲取MD5算法實例
MessageDigest md = MessageDigest.getInstance("MD5");
//傳入需要計算的字符串更新摘要信息
md.update(str.getBytes());
//獲得摘要
//BigInteger函數則將8位的字符串轉換成16位hex值,
//用字符串形式表示hash值。
String result = new BigInteger(1, md.digest()).toString(16);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:
364620d83dfd1e22936d6e9792068b67
MD5 的應用場景
經典的使用時序圖如下:
系統用戶註冊:
系統用戶登錄:
當數據庫受到攻擊時,泄漏的密碼是MD5加密的,對用戶和公司也沒有什麼損失。
SHA
安全散列算法包括SHA-1,SHA-2,其中SHA-2是SHA-224、SHA-256、SHA-384、SHA-512的統稱。
安全散列算法同MD一樣,也是固定長度摘要。SHA-1的摘要長度是160,SHA-2的摘要長度是每個名稱的後面標識數字。
SHA-1的java實現:
public class MySHA {
public static void main(String[] args) {
String str = "i am guo feng";
try {
//獲取算法實例
MessageDigest md = MessageDigest.getInstance("SHA");
//傳入需要計算的字符串更新摘要信息
md.update(str.getBytes());
//獲得摘要
//BigInteger函數則將8位的字符串轉換成16位hex值,用字符串形式表示hash值。
String result = new BigInteger(1, md.digest()).toString(16);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:
f23bf780967813dd28e3af23a8960821db415791
SHA 的應用場景
最容易看得到的是,打開計算機瀏覽器的管理證書,例如我的360極速瀏覽器的證書,點開一個證書,可以看到指紋算法 sha1 和指紋:
經典的使用時序圖如下:
消息鑑別是指:在接收方將原始消息使用公佈的摘要算法進行摘要,然後把摘要結果和接收的摘要消息進行比對,從而進行處理。
大部分發送方以“原始消息+Key+時間戳”的類似格式進行摘要處理,然後發送。