文章目录
一、HMAC介绍
HMAC(Hash-based Message Authentication Code)即基于哈希的消息认证码,它是一种通过 使用加密哈希函数(如 MD5、SHA系列算法) 和 一个密钥 来生成消息认证码的算法。HMAC 的主要作用是验证消息的完整性和真实性,确保消息在传输过程中没有被篡改,同时也能验证消息的发送者身份。如下图所示:

二、HMAC工作过程
-
- 初始化:选择一个加密哈希函数(如 MD5)和一个密钥(通常是一个随机的字节序列)。
-
- 预处理:将密钥进行处理,使其长度与哈希函数的块大小相匹配。
-
- 生成内部和外部哈希:通过将处理后的密钥与内部和外部填充值相结合,生成两个哈希值。
-
- 计算最终 HMAC:将内部哈希结果作为输入,与外部哈希进行计算,得到最终的 HMAC 值。
三、如何一眼识别HMAC加密?
3.1 长度判断
密文长度,跟据选中的不同哈希算法的长度相对应:
- MD5:128 位,以十六进制表示为 32 个字符。
- SHA-1:160 位,以十六进制表示为 40 个字符。
- SHA-256:256 位,以十六进制表示为 64 个字符。
- SHA-512:512 位,以十六进制表示为 128 个字符。
3.2 验证字符集
- 仅包含十六进制字符:确保哈希值只包含
0-9和a-f(a、b、c、d、e、f)。注意事项:哈希密文虽然是小写,但是别人也许会在生成后用.toUpperCase()全部转大写。 - 无其他字符:如
g-z、空格、特殊符号等。
3.3 库函数或自定义函数
寻找代码中是否出现MD5或者SHA等 + 一个密钥的加密组合。
四、实现HMAC加密
4.1 JavaScript实现HMAC加密
使用 crypto-js 库:
const CryptoJS = require('crypto-js');
// 待加密的消息
const message = '123456';
// 密钥
const secretKey = 'mySecretKey';
// 支持的哈希算法
const algorithms = [
{ name: 'MD5', func: CryptoJS.HmacMD5 },
{ name: 'SHA1', func: CryptoJS.HmacSHA1 },
{ name: 'SHA256', func: CryptoJS.HmacSHA256 },
{ name: 'SHA512', func: CryptoJS.HmacSHA512 }
];
algorithms.forEach(({ name, func }) => {
// 计算 HMAC 摘要
const hmacDigest = func(message, secretKey).toString();
// 输出算法名称、密文和密文长度
console.log(`算法: ${name}`);
console.log('密文:', hmacDigest);
console.log('密文长度:', hmacDigest.length);
console.log('-------------------');
});
运行结果:
算法: MD5
密文: c33cbf2b0eb8f0e24c6ac72d5881811d
密文长度: 32
-------------------
算法: SHA1
密文: 0f1a8a437232b9e49a9f0fb6a13dc7a8deea7b46
密文长度: 40
-------------------
算法: SHA256
密文: 5494bf4e6ac4d36b9409a105f7d79c1531a98761bd97738aeb160d81709917db
密文长度: 64
-------------------
算法: SHA512
密文: 3ab461df717c0f919581c331637902101b95cedb2a516ac687909c8b905a08ca879a828526838865a11fa7a8b637dc5114ef2bf9ea3f9b0f8bcef6d1b2c407cb
密文长度: 128
-------------------
4.2 Python实现HMAC加密
import hmac
import hashlib
# 待加密的消息
message = '123456'.encode()
# 密钥
secret_key = 'mySecretKey'.encode()
# 支持的哈希算法
algorithms = [
('MD5', hashlib.md5),
('SHA1', hashlib.sha1),
('SHA256', hashlib.sha256),
('SHA512', hashlib.sha512)
]
for name, hash_func in algorithms:
# 计算 HMAC 摘要
hmac_digest = hmac.new(secret_key, message, hash_func).hexdigest()
# 输出算法名称、密文和密文长度
print(f'算法: {name}')
print('密文:', hmac_digest)
print('密文长度:', len(hmac_digest))
print('-------------------')
运行结果:
算法: MD5
密文: c33cbf2b0eb8f0e24c6ac72d5881811d
密文长度: 32
-------------------
算法: SHA1
密文: 0f1a8a437232b9e49a9f0fb6a13dc7a8deea7b46
密文长度: 40
-------------------
算法: SHA256
密文: 5494bf4e6ac4d36b9409a105f7d79c1531a98761bd97738aeb160d81709917db
密文长度: 64
-------------------
算法: SHA512
密文: 3ab461df717c0f919581c331637902101b95cedb2a516ac687909c8b905a08ca879a828526838865a11fa7a8b637dc5114ef2bf9ea3f9b0f8bcef6d1b2c407cb
密文长度: 128
-------------------


被折叠的 条评论
为什么被折叠?



