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 閱讀(1592) 評論(1)  編輯  收藏 所屬分類: BounyCastle&JCE

          導航

          統計

          常用鏈接

          留言簿(110)

          我參與的團隊

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 铜鼓县| 梅州市| 白山市| 滨州市| 扎鲁特旗| 乌兰县| 大冶市| 思南县| 桐城市| 长沙县| 孝义市| 青河县| 巴马| 松桃| 博客| 阿图什市| 宝鸡市| 冕宁县| 杭州市| 馆陶县| 武胜县| 长泰县| 新营市| 安龙县| 专栏| 临邑县| 黑龙江省| 苍南县| 射洪县| 密山市| 文昌市| 肃南| 庄河市| 高州市| 屯昌县| 察雅县| 西乡县| 灵台县| 陇南市| 兴仁县| 勐海县|