计算HMAC

来源:互联网 时间:1970-01-01

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

}

}



相关阅读:
Top