HMAC 与密钥派生
仅通过计算 hash_func(key + msg) 获得 MAC(消息认证码)被认为是不安全的(参见详细信息)。建议改用 HMAC 算法,例如 HMAC-SHA256、HMAC-SHA3-512 或其他安全的 MAC 算法。
什么是 HMAC?
HMAC = 基于哈希的消息认证码(使用密码学哈希函数计算的 MAC 码):
HMAC(key, msg, hash_func) -> hash
所得 MAC 码是与秘密密钥混合的消息哈希。它具有哈希的密码学属性:不可逆、抗碰撞等。
hash_func 可以是任何密码学哈希函数,例如 SHA-256、SHA-512、RIPEMD-160、SHA3-256 或 BLAKE2s。
HMAC 用于保证消息的真实性和完整性,有时也用于密钥派生。
密钥派生函数(KDF)
密钥派生函数(KDF)是一种将可变长度密码转换为固定长度密钥(位序列)的函数:
function(password) -> key
可以把 SHA256 用作一种非常简单的 KDF 函数:直接对密码进行哈希。但不要这样做,因为这不安全。简单哈希容易受到字典攻击。
作为一种更复杂的 KDF 函数,可以使用称为“盐”的随机值,通过计算 HMAC(salt, msg, SHA256) 从密码派生密钥。盐与派生密钥一同存储,之后用于再次从密码派生出相同密钥。
HKDF(基于 HMAC 的密钥派生)适合从高熵的输入密钥材料中派生一个或多个密钥,但不适合直接处理低熵密码。从密码派生密钥时,应使用专门的密码 KDF,如 PBKDF2、Bcrypt、Scrypt 或 Argon2。后续将讨论这些 KDF 函数。
HMAC 计算——示例
要更好地理解 HMAC 及其计算方式,可以试用此在线工具:https://www.freeformatter.com/hmac-generator.html

尝试计算 HMAC('sample message', '12345', 'SHA256'):
HMAC('sample message', '12345', 'SHA256') =
'ee40ca7bc90df844d2f5b5667b27361a2350fad99352d8a6ce061c69e41e5d32'
请亲自尝试上述示例。