`
security
  • 浏览: 379462 次
  • 来自: www.pgp.org.cn
社区版块
存档分类
最新评论

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

 }


}

分享到:
评论
1 楼 webbzheng 2006-12-29  
本例子用KeyGenerator生成key,实际上,key可以保存起来,也可以被分发给其他人
~~~~~~~~~~~~~~~~~~
请问一下,怎么保存hmac的这个key?是用 serialize的功能吗?

相关推荐

    函数库(用于计算 HMAC 值)

    在本库中,我们专注于实现一个用于计算HMAC值的DLL(动态链接库)函数,这在软件开发中非常实用,尤其是在需要确保数据传输安全的场景下。 **HMAC算法** HMAC是基于单向哈希函数和密钥构造的一种消息认证码。它的...

    用于计算 hmac 值的函数库

    HMAC(Hash-based Message Authentication Code...综上所述,这个压缩包提供了一个用于计算HMAC值的函数库,适用于需要验证数据完整性和来源的场景。通过理解和正确使用这个库,开发者能够加强他们的应用程序的安全性。

    Laravel开发-laravel-hmac-signature

    首先,你需要获取请求中的原始数据和签名,然后使用相同的密钥和算法重新计算HMAC。如果新生成的签名与接收到的签名匹配,那么数据就被认为是有效的和未被篡改的。 5. **中间件实现**:在Laravel中,可以编写自定义...

    Hmac算法c语言实现

    6. **比较与验证**:当接收端收到带有HMAC的消息时,它会重复上述过程,使用相同的密钥和消息来计算HMAC,并将其与接收到的HMAC值进行比较。如果两者匹配,则数据被认为是完整的且来自预期的发送者。 在C语言中,...

    C++ HMAC SHA1

    接口通常会包含初始化函数、输入数据、设置密钥、计算HMAC以及获取结果等方法。 使用HMAC SHA1的好处包括: 1. 安全性:HMAC的使用增加了攻击者伪造消息的难度,因为需要知道正确的密钥。 2. 可靠性:通过比较计算...

    iOS HMAC示例

    4. 计算HMAC值:使用`CC_SHA256`或你选择的哈希函数,结合密钥和要验证的数据,计算HMAC值。以下是一个简单的Objective-C代码示例: ```objc #import NSData *keyData = [yourKey dataUsingEncoding:NSUTF8String...

    HMACall_hash_hmac_加密_

    1. **数据完整性验证**:在文件传输、网络通信中,接收方可以通过计算接收到的数据的HMAC并与发送方提供的HMAC比较,来确认数据是否在传输中被修改。 2. **身份验证**:在登录系统中,服务器可能会用HMAC来验证...

    C++ HMAC_SHA1加密

    8. **比较和验证HMAC**:如果接收到的消息带有HMAC值,可以用同样的密钥和消息重新计算HMAC,比较两者是否一致来验证消息的完整性和真实性。 提供的文档很可能会详细介绍如何使用这个C++库,包括示例代码、函数解释...

    HMac.rar_hmac

    4. 验证过程:接收方通过同样的方式计算HMAC,并与接收到的HMAC值进行比较,一致则表明消息未被篡改且来自可信源。 总之,HMAC是安全通信中不可或缺的一部分,通过结合哈希函数和密钥,提供了数据完整性和认证的...

    hmac.zip_hmac_java hmac_zip

    // 计算HMAC byte[] hmac = mac.doFinal(data); // 输出Base64编码的HMAC,方便查看 System.out.println(Base64.getEncoder().encodeToString(hmac)); } } ``` **与ZIP文件的结合:** HMAC可以用于保护ZIP...

    asp版hmac_sha1加密方式,真正和PHP的hash_hmac加密结果完全一样。支持中文utf-8编码

    3. 使用步骤2的结果再次进行 SHA1 哈希计算,得到最终的 HMAC_SHA1 值。 三、PHP 的 `hash_hmac` 函数 PHP 提供了内置的 `hash_hmac` 函数,用于计算 HMAC 值。它的语法为 `hash_hmac($algo, $data, $key, $raw_...

    hmac.rar_hmac_hmac aes_hmac pudn_hmac-sha1_验证码

    这样,发送者和接收者可以使用相同的密钥来计算HMAC值,并比较它们是否一致,从而判断消息在传输过程中是否被篡改。** **在描述中提到,“我开发的这个程序可以进行任意长度的消息验证”,这意味着该程序具备处理...

    hmac散列函数

    7. **验证过程**:接收方收到消息和HMAC值后,使用相同的密钥和散列函数重新计算HMAC。如果计算出的HMAC值与接收到的一致,那么可以确认消息的完整性和来源。 8. **应用实例**:HMAC广泛应用于HTTPS中的TLS协议、...

    HMAC-SHA1 算法签名 亲测可用

    3. **计算HMAC**:调用`ComputeHash()`方法,传入要签名的消息(message)的字节数组。该方法会返回一个字节数组,表示HMAC值。 4. **转换为十六进制字符串**:为了便于展示和传输,通常需要将计算得到的二进制HMAC...

    HMAC-sha256.zip

    这个函数创建了一个HMAC上下文,初始化使用SHA-256和给定的密钥,然后更新上下文以包含消息,最后计算HMAC并返回结果。返回的HMAC值通常以字节向量的形式表示,可以根据需求转换为其他格式。 在实际应用中,HMAC-...

    Java 加解密技术系列之HMAC.pdf

    - 验证时,使用相同的密钥和步骤重新计算HMAC,并比较结果。 5. 示例代码: ```java import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; public class HMACExample { public static byte[] ...

    HMac.rar_hmac linux

    3. 消息分块处理:如果消息过长,如何分块并逐块计算HMAC。 4. HMAC计算过程:按照RFC2104规定的两步过程进行,即内层哈希和外层哈希。 5. 错误处理和边界检查:确保在异常情况下能正确处理,防止安全漏洞。 总的来...

    HMAC-MD5 C语言算法

    4. **计算HMAC值**:当所有消息数据处理完毕后,调用`HMAC_Final()`计算HMAC值,并将其存储在一个缓冲区中。 5. **清理上下文**:使用`HMAC_CTX_free()`释放HMAC上下文资源。 6. **验证HMAC**:为了验证消息的完整...

    腾讯云·短信·TC3-HMAC-SHA256API3.0签名V3算法带发送例子

    4. **计算HMAC**:使用`HMAC-SHA256`算法,用上一步得到的签名Key对字符串ToSign进行哈希运算,生成一个256位的哈希值。 5. **Base64编码**:将HMAC的结果进行Base64编码,得到最终的签名值。 6. **添加签名到请求...

Global site tag (gtag.js) - Google Analytics