计算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();
     }
 

 }


}

你可能感兴趣的:(算法,Security,网络应用,SUN,C)