HMAC-MD5(HMAC with MD5)
HMAC-MD5 は HMAC(Keyed-Hash Message Authentication Code)を MD5 で構成したメッセージ認証コード(message authentication code)です。暗号化(encryption)ではなく、鍵(key)とメッセージから改ざん検出用のタグ(tag)を生成します。表記ゆれの「HMCA-MD5」は HMAC-MD5 を指すものとして扱います。
MD5 のブロックサイズ(block size)は 64 バイトです。
- 鍵を正規化(normalize)
- 鍵長 > 64:
K = MD5(K) - 鍵長 < 64:
K = K || 0x00...(64 バイトまでゼロ埋め)
- 鍵長 > 64:
ipad = 0x36を 64 バイト、opad = 0x5cを 64 バイト用意- 内部ハッシュ(inner):
MD5((K ⊕ ipad) || message) - 外部ハッシュ(outer):
MD5((K ⊕ opad) || inner)
式で表すと以下です。
HMAC(K, m) = MD5((K ⊕ opad) || MD5((K ⊕ ipad) || m))
NTLMv2 での利用
Section titled “NTLMv2 での利用”- NTLMv2 Hash:
HMAC-MD5(key=NTHash, msg=Uppercase(Username) + Domain)
Username/Domainは UTF-16LE です。 - NTProofStr:
HMAC-MD5(key=NTLMv2 Hash, msg=ServerChallenge + Blob) - NTLMv2 Response:
NTProofStr || Blob
セキュリティ上の注意
Section titled “セキュリティ上の注意”- HMAC は MD5 の衝突耐性に依存しないため、単純な MD5 よりは安全性が高いです。
- ただし HMAC-MD5 はレガシー用途(legacy use)であり、新規設計ではより強い方式(HMAC-SHA-256 など)を選ぶべきです。
Rust での表現
Section titled “Rust での表現”[dependencies]hmac = "0.12"md-5 = "0.10"hex = "0.4"use hmac::{Hmac, Mac};use md5::Md5;
type HmacMd5 = Hmac<Md5>;
pub fn hmac_md5(key: &[u8], message: &[u8]) -> [u8; 16] { let mut mac = HmacMd5::new_from_slice(key).expect("HMAC accepts any key size"); mac.update(message); let result = mac.finalize().into_bytes(); let mut out = [0u8; 16]; out.copy_from_slice(&result); out}
fn main() { let tag = hmac_md5(b"key", b"message"); println!("HMAC-MD5: {}", hex::encode(tag));}- NTHash については NTHash(NT hash) を参照してください。
- NTLMv2 の応答での使われ方は NTLM 認証 を参照してください。

