计算HMAC

Message Authentication Code (MAC) 是用于确信信息在传输过程中没有被修改过,体现了信息完整性, MAC 有很多种算法,大部分算法用于简单的场景(如文件传输),他们都有效,但如果用于都未曾考虑会被恶意攻击的情况,在密码学领域中,更多被应用的是 HMACHMAC 更安全,因为它是基于 Key 的。 HMAC 是使用诸如 MD5,SHA-1 等散列算法构造 MAC

HMAC 在这样一种场景中被应用:

巴赫尔、穆罕默德是为伊拉克临时政府中不同的伊斯兰派系,由于美国已经在伊拉克设置了大量情报机构,他们担心政府部内部文件在网络传输可能被美国情报局修改,考虑起见,巴赫尔、穆罕默德决定使用 MAC 技术:

1,  他们商榷一个简单的密钥 Key1

2,  他们商榷一种可靠的 HMAC 算法,如 HMACSHA1

3,  他们每次发送政府审批报告前,都用 HMACSHA1 进行计算,并将该 hmacx1 附带发送给对方

4,  对方接收到文件,将文件进行一次 HMAC 的计算,得出新的 hmacx2 ,对比 x1x2 ,可以知道文件是否在中途被修改过。

注意,上述的步骤如果不考虑恶意攻击者,可以使用消息摘要,恶意攻击者可以修改你的文件,然后重新帮你计算摘要,最后替换你的摘要:(

       关于 HMAC 的更多标准,可以参考 RFC2104

None.gif package  org.dev2dev.security.test.mac;
None.gif
None.gif
import  java.io.File;
None.gif
import  java.io.IOException;
None.gif
import  java.security.InvalidKeyException;
None.gif
import  java.security.NoSuchAlgorithmException;
None.gif
None.gif
import  javax.crypto.KeyGenerator;
None.gif
import  javax.crypto.Mac;
None.gif
import  javax.crypto.SecretKey;
None.gif
None.gif
import  org.dev2dev.common.FileUtils;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public   class  TestHmac dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/** */ /**
InBlock.gif  * 
@param  args
ExpandedSubBlockEnd.gif  
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif 
public   static   void  main(String[] args)  dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif     
try   dot.gif {
InBlock.gif         
// 首先需要生成Hmac的key,有比较多种方法,HmacSHA1,算法类型可以参考KeyGenerator算法列表 
              // 本例子用KeyGenerator生成key,实际上,key可以保存起来,也可以被分发给其他人
InBlock.gif
         KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5"); 
InBlock.gif
         SecretKey key = keyGen.generateKey();
InBlock.gif         Mac mac 
= Mac.getInstance(key.getAlgorithm());
InBlock.gif         mac.init(key);
InBlock.gif             
InBlock.gif         File infile
=new File("c:\\1.txt");
InBlock.gif         
byte[] inputbyte=null;
ExpandedSubBlockStart.gifContractedSubBlock.gif   
try dot.gif{
InBlock.gif    inputbyte 
= FileUtils.getBytesFromFile(infile);
ExpandedSubBlockStart.gifContractedSubBlock.gif   }
 catch (IOException e) dot.gif{
InBlock.gif    e.printStackTrace();
ExpandedSubBlockEnd.gif   }

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

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值