1. 程式人生 > >password學4——Java 加密解密之消息摘要算法(MD5 SHA MAC)

password學4——Java 加密解密之消息摘要算法(MD5 SHA MAC)

加密解密 hash函數 -s -m hmac 可能 正向 技術發展 哈希算法

Java 加密解密之消息摘要算法(MD5 SHA MAC)


消息摘要

消息摘要(Message Digest)又稱為數字摘要(Digital Digest)。

它是一個唯一相應一個消息或文本的固定長度的值,它由一個單向Hash加密函數對消息進行作用而產生。假設消息在途中改變了。則接收者通過對收到消息的新產生的摘要與原摘要比較。就可知道消息是否被改變了。因此消息摘要保證了消息的完整性。消息摘要採用單向Hash 函數將需加密 的明文"摘要"成一串128bit的密文。這一串密文亦稱為數字指紋(Finger Print),它有固定的長度。且不同的明文摘要成密文,其結果總是不同的,而相同的明文其摘要必然一致 。這樣這串摘要便可成為驗證明文是否是"真身"的"指紋"了。

HASH函數的抗沖突性使得假設一段明文稍有變化,哪怕僅僅更改該段落的一個字母,通過哈希算法作用後都將產生不同的值。

而HASH算法的單向性使得要找到到哈希值同樣的兩個不 同的輸入消息。在計算上是不可能的。所以數據的哈希值。即消息摘要,能夠檢驗數據的完整性。哈希函數的這樣的對不同的輸入能夠生成不同的值的特性使得無法找到兩個具有同樣哈希值的輸入。

因此。假設兩個文檔經哈希轉換後成為同樣的值,就能夠肯定它們是同一文檔。 所以。當希望有效地比較兩個數據塊時,就能夠比較它們的哈希值。比如。能夠通過比較郵件發送前和發送後的哈希值來驗證該郵件在傳遞時是否改動。

消息摘要算法

消息摘要算法的主要特征是加密過程不須要密鑰,而且經過加密的數據無法被解密,僅僅有輸入同樣的明文數據經過同樣的消息摘要算法才幹得到同樣的密文。

消息摘要算法不存在 密鑰的管理與分發問題,適合於分布式網絡同樣上使用。因為其加密計算的工作量相當可觀,所以曾經的這樣的算法通常僅僅用於數據量有限的情況下的加密。比如計算機的口令就是 用不可逆加密算法加密的。近年來,隨著計算機同樣性能的飛速改善,加密速度不再成為限制這樣的加密技術發展的桎梏,因而消息摘要算法應用的領域不斷添加。

消息摘要算法的特點:

① 不管輸入的消息有多長,計算出來的消息摘要的長度總是固定的。
② 消息摘要看起來是“隨機的”。

這些比特看上去是胡亂的雜湊在一起的。
③ 一般地。僅僅要輸入的消息不同,對其進行摘要以後產生的摘要消息也必不同樣;但同樣的輸入必會產生同樣的輸出。
④ 消息摘要函數是無陷門的單向函數,即僅僅能進行正向的信息摘要,而無法從摘要中恢復出不論什麽的消息,甚至根本就找不到不論什麽與原信息相關的信息。
⑤ 好的摘要算法。無法找到兩條消息,是它們的摘要同樣。

現有的消息摘要算法

消息摘要算法包括MD、SHA和MAC三大系列。經常使用於驗證數據的完整性,是數據簽名算法的核心算法。
MAC與MD和SHA不同,MAC是含有密鑰的散列函數算法。我們也常把MAC稱為HMAC。

JDK對消息摘要算法的支持

JDK6支持MD2/MD5/SHA/SHA256/SHA384/SHA512/HmacMD5/HmacSHA1/ HmacSHA256/HmacSHA384/HmacSHA512

使用到 十六進制工具類Hex.java 見: java byte數組與十六進制字符串互轉

MD和SHA系列的java實現:

DigestUtils.java

Java代碼 技術分享
  1. import java.security.MessageDigest;
  2. import java.security.NoSuchAlgorithmException;
  3. /**
  4. password學4——Java 加密解密之消息摘要算法(MD5 SHA MAC)