HMAC (해시 기반 메시지 인증 코드) 구현 원리

1, HMAC 개념

HMAC (해시 기반 메시지 인증 코드) 해시 기반 메시지 인증 코드는, 보안 통신이 필요한 구성 부품이다.

메시지 침해를 방지하기 위해, 그리고 대칭 암호화와 데이터 통신의 무결성을 보호 할 수 있습니다.

참조 HMAC 구현 사양, 해시 알고리즘이 될 수 MD5, SHA1, SHA-2 (SHA256, sha385, SHA512) 등;

다음과 같이 해시 알고리즘의 특정 구현을 고려하지 않고, 그 구현 방법은 다음과 같습니다


1) 주요 작성 :

      키가 더 이상 패킷 길이 해시 기능 (블록 _ 크기)를 초과하면, 해시 키 값을 획득하기 위해 해시 함수를 사용하여,이 해시 값은 다음 HMAC 키로서 사용된다.

      그것은 단방향 해쉬 함수의 패킷 길이의 길이에 도달 할 때까지 짧은 길이 점수의 중요한 경우는 0, 결국 충전된다.

      참고 : 일반적으로 블록 _ 크기의 패킷 길이보다 짧은 및 해시 값 digest_size의 길이가 있으므로, 사실, 해시 값을 계산 한 후 패킷의 길이보다 긴, 꼬리 0을 기입 할 필요가 남아있다.

2) 충전 키를 작성 후 XOR ipad에 함께 키와 XOR 연산이 아이 패드로 지칭되는 비트 시퀀스.

     00,110,110시오가 형성 될 때까지 (즉, 36 진수) 패킷 연속주기 길이의 비트 시퀀스가 반복되는 비트 시퀀스이다. 상기 i는 내부 의미입니다 IPAD.

     값은 XOR 연산에 의해 얻어지고, 패킷 길이가 같은 일방향 해시 함수, 및 키와 연관된 비트 시퀀스이다. 여기에서 우리는 비트 시퀀스 ipadkey 될 것입니다.

3) ipadkey 조합 메시지에 메시지, 즉 비트 시퀀스와 연관된 키들과 함께 (ipadkey)는 메시지의 시작 부분에 추가 .

4)计算散列值 将步骤3的结果输入单向散列函数,并计算出散列值。

5)填充后的密钥与opad的XOR 将填充后的密钥与被称为opad的比特序列进行XOR运算。

    opad是将01011100这一比特序列(即十六进制5C)不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。

    XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里我们将这个比特序列称为opadkey。

6)与散列值组合 opadkey附加在步骤4的散列值前面。

7)计算散列值 将步骤6的结果输入单向散列函数,并计算出散列值。这个值就是最终的MAC值。

 

2、HMAC Python hmac库实现

在 Python 中, 直接提供了 hmac 库实现相关操作。

如下所示,是yvivid基于 hmac库的一个实现。

更多hmac库的使用,请参考 python doc。

 

3、HMAC 的 笨办法( 仅利用Python hashlib库实现)

基于HMAC的原理,是否可以在已有 hash算法上,自己实现 HMAC算法。

下面是 yvivid 在 Python上,基于 hashlib库(hash算法)的基础上,HMAC自行编码的一个实现的。

1)由于 需要 XOR是实现,因此 使用了 int 和 bytes的转换,写的不是很简洁(逻辑电路的思维)。

2) i_key_pad 和 o_key_pad 实际上展开到 block_size长度了。

 

注:其实 在自己实现时,还没注意到 python的 hmac 库,结果是自己摸索 和 openssl输出进行对比分析的。

大家可自己分析 Python36\Lib\hmac.py 的代码。部分处理比我写的简洁,使用了 bytes的 ljust,translate特性。

但只有自己实现 才能感觉到其真实的原理。

4、易混淆的概念

1)填充阶段,尤其是 分组长度block_size 和 摘要(散列值)长度digest_size,

描述的概念比较混淆,导致编写代码过程走了弯路。

分组长度block_size 是 Hash 处理输入数据时,是按照 block_size大小来分块(block)处理的。

摘要(散列值)长度digest_size 是 Hash完成后,输出的 摘要(散列值)字节长度。 

2)XOR 阶段,yvivid的实现采用了并行的思路,基于整数 的异或操作(python语法的 ^)。

3)Python 语法方面,对于 bytes 还是不熟悉,需要进一步学习。

 

附录:常用散列算法的分组长度和摘要长度。

单向散列函数 分组长度 block_size 摘要长度digest_size
MD5 64 Bytes (512bit) 16 Bytes (128bit)
SHA1 64 Bytes (512bit) 20 Bytes (160bit)
SHA256 64 Bytes (512bit) 32 Bytes (256bit)
SHA512 128 Bytes (1024bit)

64 Bytes (512bit)

 

 

 

 

 

 

原创声明:

HMAC原理是公共的,但 python代码实现(尤其是 基于hashlib下 自己的编写),是基于本人在 python 实现,转载请声明出处。

https://www.cnblogs.com/yvivid/p/hmac_basic.html 

 

参考文献:

1) 图解密码技术(第3版) ,[日]结城浩;

    学习笔记:http://flamepeak.com/2016/11/23/tu-jie-mi-ma-ji-shu-authentication20161123/

2) Python 3.6.8 documentation / Library Reference

     hashlib — Secure hashes and message digests

     hmac — Keyed-Hashing for Message Authentication

 

추천

출처www.cnblogs.com/yvivid/p/hmac_basic.html