消息摘要
算法簡述
定義
它是一個唯一對應一個消息或文本的固定長度的值,它由一個單向Hash加密函數(shù)對消息進行作用而產(chǎn)生。如果消息在途中改變了,則接收者通過對收到消息的新產(chǎn)生的摘要與原摘要比較,就可知道消息是否被改變了。因此消息摘要保證了消息的完整性。消息摘要采用單向Hash 函數(shù)將需加密的明文"摘要"成一串密文,這一串密文亦稱為數(shù)字指紋(Finger Print)。它有固定的長度,且不同的明文摘要成密文,其結(jié)果總是不同的,而同樣的明文其摘要必定一致。這樣這串摘要便可成為驗證明文是否是"真身"的"指紋"了。
特點
消息摘要具有以下特點:
(1)唯一性:數(shù)據(jù)只要有一點改變,那么再通過消息摘要算法得到的摘要也會發(fā)生變化。雖然理論上有可能會發(fā)生碰撞,但是概率極其低。
(2)不可逆:消息摘要算法的密文無法被解密。
(3)不需要密鑰,可使用于分布式網(wǎng)絡。
(4)無論輸入的明文有多長,計算出來的消息摘要的長度總是固定的。
原理
消息摘要,其實就是將需要摘要的數(shù)據(jù)作為參數(shù),經(jīng)過哈希函數(shù)(Hash)的計算,得到的散列值。
常用算法
消息摘要算法包括MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)、MAC(Message AuthenticationCode,消息認證碼算法)共3大系列,常用于驗證數(shù)據(jù)的完整性,是數(shù)字簽名算法的核心算法。
MD5和SHA1分別是MD、SHA算法系列中最有代表性的算法。
如今,MD5已被發(fā)現(xiàn)有許多漏洞,從而不再安全。SHA算法比MD算法的摘要長度更長,也更加安全。
算法實現(xiàn)
MD5、SHA的范例
JDK中使用MD5和SHA這兩種消息摘要的方式基本一致,步驟如下:
(1)初始化MessageDigest對象
(2)更新要計算的內(nèi)容
(3)生成摘要
importjava.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary.Base64; public class MsgDigestDemo{ public static void main(String args[]) throws NoSuchAlgorithmException, UnsupportedEncodingException { String msg = "Hello World!"; MessageDigest md5Digest = MessageDigest.getInstance("MD5"); // 更新要計算的內(nèi)容 md5Digest.update(msg.getBytes()); // 完成哈希計算,得到摘要 byte[] md5Encoded = md5Digest.digest(); MessageDigest shaDigest = MessageDigest.getInstance("SHA"); // 更新要計算的內(nèi)容 shaDigest.update(msg.getBytes()); // 完成哈希計算,得到摘要 byte[] shaEncoded = shaDigest.digest(); System.out.println("原文: " + msg); System.out.println("MD5摘要: " + Base64.encodeBase64URLSafeString(md5Encoded)); System.out.println("SHA摘要: " + Base64.encodeBase64URLSafeString(shaEncoded)); } }