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