報文鑑別在身分認證中佔重要位置,是認證系統的重要環節,在金融和商業系統中廣泛應用。
封包鑑別常用封包鑑別碼(Message Authentication Code,即MAC)作為鑑別的基礎,
其基本原則是:用一個金鑰((private Key))產生一個小資料塊附加在要傳輸的封包後面。這種技術是假定通訊雙方共用一個金鑰K,當通訊的一方要傳送資料M給另一方時,透過特定的演算法計算出該封包M的MAC=F(K,M),這裡的F就是指涉別運算函數,然後封包資料M和MAC一起傳送給另一方。當另一方收到資料時,先用同樣的演算法F計算MAC,和傳輸過來的MAC進行比較,如果相同,則認為資料是正確的。 鑑別函數常被認為是加密演算法的一種,但是差異在於它不用於逆運算,有一定的安全性。 通常對於不同的應用系統採用各自特定的鑑別函數,這在一定程度上確保了資料的安全性。
從j2sdk1.4以後,java提供了類別javax.crypto.Mac類報文鑑別
view plaincopy to clipboardprint?
byte[] macData = "this is a mac test".getBytes(); //get a instance of Mac, using HmacMD5 algorithm
Mac mac = Mac.getInstance("HmacMD5"); //init the IV of the algorithm, 8 bytes. may read from file
byte[] ivInitKey = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 };
IvParameterSpec spec = new IvParameterSpec(ivInitKey); // the secrete key bytes of the Mac validation, May read from file too
byte[] keyBytes = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,genex0a, DESede algorithm
SecretKey key = new SecretKeySpec(keyBytes, "DESede"); // init Mac mac.init(key, spec);
byte[] macCode = mac.doFinal(macData);
byte[] macData = "this is a mac test".getBytes(); //get a instance of Mac, using HmacMD5 algorithm
Mac mac = Mac.getInstance("HmacMD5"); //init the IV of the algorithm, 8 bytes. may read from file
byte[] ivInitKey = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 };
IvParameterSpec spec = new IvParameterSpec(ivInitKey); // the secrete key bytes of the Mac validation, May read from file too
byte[] keyBytes = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,genex0a, DESede algorithm
SecretKey key = new SecretKeySpec(keyBytes, "DESede"); // init Mac mac.init(key, spec);
byte[] macCode = mac.doFinal(macData);
macCode 就是產生的Mac,用同樣的金鑰能產生同樣的mac。
通訊雙方只要保證用同樣的金鑰就能保證得到同樣的Mac,達到報文驗證的目的。
看來看去,這和網路上常用的checksum原理是一樣的。
-