简单地计算hash_func(key+msg)以获得MAC(消息认证码)被认为是不安全的。建议改用HMAC算法,例如HMAC-SHA256或HMAC-SHA3-512或其他安全MAC算法。
什么是HMAC?
HMAC= Hash-based Message Authentication Code (MAC code,使用加密哈希函数计算):
HMAC(key, msg, hash_func) -> hash
结果MAC代码是混合了密钥的消息散列。它具有哈希的密码特性:不可逆、抗冲突等。
hash_func可以是任何加密哈希函数,如SHA-256、SHA-512、RIPEMD-160、SHA3-256或BLAKE2s。
HMAC用于消息真实性、消息完整性,有时用于密钥推导。
密钥导出函数(key derivation function,KDF)
密钥导出函数(KDF)是将可变长度密码转换为固定长度密钥(位序列)的函数:
function(password) -> key
作为一个非常简单的KDF函数,我们可以使用SHA256:只需对密码进行哈希。不要这样做,因为这是不安全的。简单哈希容易受到字典攻击。
作为更复杂的KDF函数,您可以通过使用称为“salt”的随机值计算HMAC(salt、msg、SHA256)来派生密码,该值与派生密钥一起存储,稍后用于从密码中再次派生同一密钥。
使用HKDF(基于HMAC的密钥推导)进行密钥推导的安全性低于现代KDF,因此专家建议使用更强的密钥推导函数,如PBKDF2、Bcrypt、Scrypt和Argon2。我们将在后面讨论所有这些KDF函数。
HMAC 计算- 举例
要更好地了解HMAC及其计算方法,请尝试以下在线工具:Free Online HMAC Generator / Checker Tool (MD5, SHA-256, SHA-512) - FreeFormatter.com
计算HMAC('sample message', '12345', 'SHA256'):
HMAC('sample message', '12345', 'SHA256') =
'ee40ca7bc90df844d2f5b5667b27361a2350fad99352d8a6ce061c69e41e5d32'
在Python中,我们可以按如下方式计算HMAC代码(使用hashlib和hmac库):
import hashlib, hmac, binascii
def hmac_sha256(key, msg):
return hmac.new(key, msg, hashlib.sha256).digest()
key = b"12345"
msg = b"sample message"
print(binascii.hexlify(hmac_sha256(key, msg)))
运行上面的代码示例:***HMAC SHA256 Examples in Python - Python Repl - Replit
上面的代码将计算并打印预期的HMAC代码(如我们前面的示例中所示):
ee40ca7bc90df844d2f5b5667b27361a2350fad99352d8a6ce061c69e41e5d32