David.Turing's blog

           

          計(jì)算HMAC

          Message Authentication Code (MAC) 是用于確信信息在傳輸過程中沒有被修改過,體現(xiàn)了信息完整性, MAC 有很多種算法,大部分算法用于簡單的場景(如文件傳輸),他們都有效,但如果用于都未曾考慮會(huì)被惡意攻擊的情況,在密碼學(xué)領(lǐng)域中,更多被應(yīng)用的是 HMAC HMAC 更安全,因?yàn)樗腔?/span> Key 的。 HMAC 是使用諸如 MD5,SHA-1 等散列算法構(gòu)造 MAC

          HMAC 在這樣一種場景中被應(yīng)用:

          巴赫爾、穆罕默德是為伊拉克臨時(shí)政府中不同的伊斯蘭派系,由于美國已經(jīng)在伊拉克設(shè)置了大量情報(bào)機(jī)構(gòu),他們擔(dān)心政府部內(nèi)部文件在網(wǎng)絡(luò)傳輸可能被美國情報(bào)局修改,考慮起見,巴赫爾、穆罕默德決定使用 MAC 技術(shù):

          1,? 他們商榷一個(gè)簡單的密鑰 Key1

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

          3,? 他們每次發(fā)送政府審批報(bào)告前,都用 HMACSHA1 進(jìn)行計(jì)算,并將該 hmac x1 附帶發(fā)送給對(duì)方

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

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

          ?????? 關(guān)于 HMAC 的更多標(biāo)準(zhǔn),可以參考 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,實(shí)際上,key可以保存起來,也可以被分發(fā)給其他人
          ?????????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(
          "計(jì)算的HMAC ="+ HmacB64);
          ?????}
          ? catch ?(InvalidKeyException?e)? {
          ??????e.printStackTrace();
          ?????}
          ? catch ?(NoSuchAlgorithmException?e)? {
          ??????e.printStackTrace();
          ?????}
          ?

          ?}


          }

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(110)

          我參與的團(tuán)隊(duì)

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊(cè)

          搜索

          積分與排名

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 拉萨市| 新竹县| 彰化市| 安顺市| 东方市| 瓮安县| 宣汉县| 锦州市| 景泰县| 通化县| 济阳县| 祥云县| 阿克苏市| 旌德县| 沙坪坝区| 曲麻莱县| 临武县| 武乡县| 榆树市| 河曲县| 板桥市| 嘉义市| 班玛县| 米脂县| 岳阳市| 武汉市| 兴隆县| 乐至县| 漳浦县| 聂荣县| 义马市| 西昌市| 凤城市| 北流市| 西丰县| 上犹县| 清水县| 台东市| 长春市| 公主岭市| 玉溪市|