天天看點

Java安全——消息摘要

标簽(空格分隔): java 安全

[toc]

消息摘要(message digest)又稱為數字摘要(digital digest)。它是一個唯一對應一個消息或文本的固定長度的值,它由一個單向hash加密函數對消息進行作用而産生。如果消息在途中改變了,則接收者通過對收到消息的新産生的摘要與原摘要比較,就可知道消息是否被改變了。是以消息摘要保證了消息的完整性。 消息摘要采用單向hash 函數将需加密的明文"摘要"成一串128bit的密文,這一串密文亦稱為數字指紋(finger print),它有固定的長度,且不同的明文摘要成密文,其結果總是不同的,而同樣的明文其摘要必定一緻。這樣這串摘要便可成為驗證明文是否是"真身"的"指紋"了。 <<百度百科>>

消息摘要其實是我們日常開發中經常遇到的,比如md5算法就是一種摘要。它是java安全提供者體系中最簡單的标準引擎。本文不會讨論算法本身,隻關注java語言體系中的實作和使用方法。具體算法原理,後續撰文學習并補充。

消息摘要通過messagedigest類實作。消息摘要通過getinstance()方法擷取算法執行個體。通過update()方法為消息摘要增加内容位元組。根據digest()方法利用累計的内容位元組計算最後的摘要。

下面的test列出了一些細節:

輸出結果如下:

消息摘要實作是通過java自己sun的實作來做的。我們常見的是md5和sha算法。

考慮到消息摘要的不安全性——拿到原文并知道算法,就可以得到正确的消息摘要。人們又加入了密鑰元素,得到了安全消息摘要——mac(message authentication code)。mac的特點是僅通過原文是無法計算出安全消息摘要的。還需要一個雙方都知道的消息密鑰。如果有人修改了消息本體,又修改了消息摘要,但是因為沒有使用密鑰,那麼将被發現破壞了資料。計算mac的方法有很多,但是核心java api沒有相關實作。java的實作主要是通過jce提供者來實作的。mac類對應消息摘要的messagedigest類。計算消息摘要時需要一個密鑰。密鑰的管理是另一個話題了。這裡主要講mac的算法,jce實作主要基于hmacsha1和hmacmd5。具體provider提供了哪些mac相關的算法,它們比較如何,見下面的代碼:

輸出如下:

這裡使用的key是通過keygenerator生成的。在實際應用中,應該有一方來生成并導出到可管理的keystore,使用方載入keystore再進行摘要生成和校驗。