爬虫逆向加密技术详解之消息摘要算法(哈希算法):HMAC加密

一、HMAC介绍

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

在这里插入图片描述

二、HMAC工作过程

    1. 初始化:选择一个加密哈希函数(如 MD5)和一个密钥(通常是一个随机的字节序列)。
    1. 预处理:将密钥进行处理,使其长度与哈希函数的块大小相匹配。
    1. 生成内部和外部哈希:通过将处理后的密钥与内部和外部填充值相结合,生成两个哈希值。
    1. 计算最终 HMAC:将内部哈希结果作为输入,与外部哈希进行计算,得到最终的 HMAC 值。

三、如何一眼识别HMAC加密?

3.1 长度判断

密文长度,跟据选中的不同哈希算法的长度相对应

  • MD5:128 位,以十六进制表示为 32 个字符。
  • SHA-1:160 位,以十六进制表示为 40 个字符。
  • SHA-256:256 位,以十六进制表示为 64 个字符。
  • SHA-512:512 位,以十六进制表示为 128 个字符。

3.2 验证字符集

  • 仅包含十六进制字符:确保哈希值只包含 0-9a-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
-------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值