David.Turing's blog

           

          計算HMAC

          Message Authentication Code (MAC) 是用于確信信息在傳輸過程中沒有被修改過,體現了信息完整性, MAC 有很多種算法,大部分算法用于簡單的場景(如文件傳輸),他們都有效,但如果用于都未曾考慮會被惡意攻擊的情況,在密碼學領域中,更多被應用的是 HMAC HMAC 更安全,因為它是基于 Key 的。 HMAC 是使用諸如 MD5,SHA-1 等散列算法構造 MAC

          HMAC 在這樣一種場景中被應用:

          巴赫爾、穆罕默德是為伊拉克臨時政府中不同的伊斯蘭派系,由于美國已經在伊拉克設置了大量情報機構,他們擔心政府部內部文件在網絡傳輸可能被美國情報局修改,考慮起見,巴赫爾、穆罕默德決定使用 MAC 技術:

          1,? 他們商榷一個簡單的密鑰 Key1

          2,? 他們商榷一種可靠的 HMAC 算法,如 HMACSHA1

          3,? 他們每次發送政府審批報告前,都用 HMACSHA1 進行計算,并將該 hmac x1 附帶發送給對方

          4,? 對方接收到文件,將文件進行一次 HMAC 的計算,得出新的 hmac x2 ,對比 x1 x2 ,可以知道文件是否在中途被修改過。

          注意,上述的步驟如果不考慮惡意攻擊者,可以使用消息摘要,惡意攻擊者可以修改你的文件,然后重新幫你計算摘要,最后替換你的摘要:(

          ?????? 關于 HMAC 的更多標準,可以參考 RFC2104

          package ?org.dev2dev.security.test.mac;

          import ?java.io.File;
          import ?java.io.IOException;
          import ?java.security.InvalidKeyException;
          import ?java.security.NoSuchAlgorithmException;

          import ?javax.crypto.KeyGenerator;
          import ?javax.crypto.Mac;
          import ?javax.crypto.SecretKey;

          import ?org.dev2dev.common.FileUtils;

          public ? class ?TestHmac {

          ?
          /**
          ??*?
          @param ?args
          ??
          */

          ?
          public ? static ? void ?main(String[]?args)? {
          ?????
          try ? {
          ?????????
          // 首先需要生成Hmac的key,有比較多種方法,HmacSHA1,算法類型可以參考KeyGenerator算法列表?
          ??????????????// 本例子用KeyGenerator生成key,實際上,key可以保存起來,也可以被分發給其他人
          ?????????KeyGenerator?keyGen?=?KeyGenerator.getInstance("HmacMD5");?
          ?????????SecretKey?key?=?keyGen.generateKey();
          ?????????Mac?mac?
          =?Mac.getInstance(key.getAlgorithm());
          ?????????mac.init(key);
          ?????????????
          ?????????File?infile
          =new?File("c:\\1.txt");
          ?????????
          byte[]?inputbyte=null;
          ???
          try?{
          ????inputbyte?
          =?FileUtils.getBytesFromFile(infile);
          ???}
          ?catch?(IOException?e)?{
          ????e.printStackTrace();
          ???}

          ?????????
          byte[]?digest?=?mac.doFinal(inputbyte);
          ?????
          ?????????
          //?If?desired,?convert?the?digest?into?a?string
          ?????????String?HmacB64?=?new?sun.misc.BASE64Encoder().encode(digest);
          ?????????System.out.println(
          "計算的HMAC ="+ HmacB64);
          ?????}
          ? catch ?(InvalidKeyException?e)? {
          ??????e.printStackTrace();
          ?????}
          ? catch ?(NoSuchAlgorithmException?e)? {
          ??????e.printStackTrace();
          ?????}
          ?

          ?}


          }

          posted on 2006-05-21 17:05 david.turing 閱讀(1582) 評論(1)  編輯  收藏 所屬分類: BounyCastle&JCE

          導航

          統計

          常用鏈接

          留言簿(110)

          我參與的團隊

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 石屏县| 祥云县| 大兴区| 霍林郭勒市| 靖州| 德保县| 桓台县| 和硕县| 镇康县| 克什克腾旗| 温宿县| 珲春市| 瓮安县| 沙湾县| 锦州市| 无锡市| 巨野县| 马尔康县| 宕昌县| 蓝田县| 泸水县| 黔南| 康乐县| 怀化市| 泗水县| 伊春市| 高台县| 防城港市| 邓州市| 杨浦区| 镇原县| 新郑市| 天祝| 江口县| 鄂托克旗| 旅游| 宁安市| 蕉岭县| 洱源县| 锡林郭勒盟| 红原县|