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();
} 
} 
}
本文介绍HMAC(基于密钥的消息认证码)的概念及其应用场景,通过示例说明如何利用HMAC确保文件在网络传输过程中的完整性。
2万+

被折叠的 条评论
为什么被折叠?



