コンテンツにスキップ

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 バイトです。

  1. 鍵を正規化(normalize)
    • 鍵長 > 64: K = MD5(K)
    • 鍵長 < 64: K = K || 0x00...(64 バイトまでゼロ埋め)
  2. ipad = 0x36 を 64 バイト、opad = 0x5c を 64 バイト用意
  3. 内部ハッシュ(inner): MD5((K ⊕ ipad) || message)
  4. 外部ハッシュ(outer): MD5((K ⊕ opad) || inner)

式で表すと以下です。
HMAC(K, m) = MD5((K ⊕ opad) || MD5((K ⊕ ipad) || m))

  • 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
  • HMAC は MD5 の衝突耐性に依存しないため、単純な MD5 よりは安全性が高いです。
  • ただし HMAC-MD5 はレガシー用途(legacy use)であり、新規設計ではより強い方式(HMAC-SHA-256 など)を選ぶべきです。
[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 認証 を参照してください。