python3 HMAC/SHA256/BASE64/MD5

本文详细介绍了如何使用Python3进行HMAC-SHA256、BASE64及MD5加密解密操作,包括步骤、代码示例和关键知识点,对于理解这些加密算法在Python中的应用非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/1/16
# @Author  :
# @Platform:


import hmac
import base64
import hashlib
from hashlib import sha256


# 直接sha256加密
def get_sha256(value):
    """
    sha256加密
    :param value: 加密字符串
    :return: 加密结果转换为16进制字符串,并大写
    """
    hsobj = hashlib.sha256()
    hsobj.update(value.encode("utf-8"))
    return hsobj.hexdigest().upper()


# 哈希sha256加密
def get_KEY_hashlib_sha256(key, value):
    """
    直接 sha256加密
    :param key:
    :param value: 加密字符串
    :return: 加密结果转换为16进制字符串,并大写
    """
    hsobj = hashlib.sha256(key.encode("utf-8"))
    hsobj.update(value.encode("utf-8"))
    return hsobj.hexdigest().upper()


# HMAC 不带密钥KEY 哈希sha256加密
def get_hmac_hashlib_sha256(value):
    """
    hmacsha256加密
    :param value: 加密字符串
    :return: 加密结果转换为16进制字符串,并大写
    """
    message = value.encode(
<think>我们正在讨论HMAC-SHA256签名算法。根据用户的问题,他想要了解其实现原理和代码示例。 根据引用[2],我们知道HMAC-SHA256的计算公式为:HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M)) 其中: - K 是密钥 - M 是消息 - H 是SHA-256哈希函数 - opad 是外部填充(0x5c重复多次) - ipad 是内部填充(0x36重复多次) ⊕ 表示异或运算 || 表示连接 步骤: 1. 如果密钥K的长度大于块的字节大小(SHA-256的块大小是64字节),则先对K进行哈希,使其长度变为32字节(SHA-256输出长度),然后后面补0直到64字节。 如果密钥长度小于64字节,则后面补0直到64字节。 2. 计算 K ⊕ ipad(ipad是0x36重复64次) 3. 将消息M附加到第2步的结果后面,然后计算整个数据的SHA-256哈希值,得到内部哈希结果。 4. 计算 K ⊕ opad(opad是0x5c重复64次) 5. 将第3步得到的内部哈希结果附加到第4步的结果后面,然后计算整个数据的SHA-256哈希值,得到最终的HMAC值。 现在,我们将使用Python代码来实现HMAC-SHA256。注意,在实际编程中,我们通常使用标准库中的hmac模块,但为了演示原理,我们将自己实现。 代码实现步骤: 1. 定义块大小(64字节)和输出大小(32字节)。 2. 对密钥进行预处理:如果密钥长度超过64字节,则先进行SHA-256哈希,然后补0到64字节;如果不足64字节,则补0。 3. 计算ipad和opad(分别与0x36和0x5c异或)。 4. 计算 inner_hash = SHA256((K ⊕ ipad) || message) 5. 计算 HMAC = SHA256((K ⊕ opad) || inner_hash) 注意:在计算内部哈希时,我们是将异或后的密钥与消息拼接后计算哈希;在计算最终结果时,是将异或后的密钥与内部哈希值拼接后计算哈希。 但是,请注意,内部哈希的结果是32字节的,而我们需要将其与64字节的(K ⊕ opad)拼接。所以,在第二步中,我们使用64字节的块。 下面我们用Python代码实现(不使用hmac模块,而是用hashlib的sha256来手动实现):</think>### HMAC-SHA256 签名算法原理 HMAC-SHA256 是一种基于密钥的消息认证码算法,结合了 SHA-256 哈希函数和 HMAC 结构,用于验证消息完整性和真实性。其核心原理如下: 1. **密钥处理** 若密钥长度超过 SHA-256 的块大小(64字节),先对密钥进行 SHA-256 哈希;若不足64字节,则补零至64字节。记处理后的密钥为 $K$。 2. **内部填充计算** 创建常量 $\text{ipad} = \text{0x36}$ 重复64次,计算: $$K \oplus \text{ipad}$$ 将消息 $M$ 附加到结果后,计算 SHA-256 哈希值: $$\text{inner\_hash} = \text{SHA256}((K \oplus \text{ipad}) \parallel M)$$ 3. **外部填充计算** 创建常量 $\text{opad} = \text{0x5C}$ 重复64次,计算: $$K \oplus \text{opad}$$ 将 $\text{inner\_hash}$ 附加到结果后,再次计算 SHA-256: $$\text{HMAC} = \text{SHA256}((K \oplus \text{opad}) \parallel \text{inner\_hash})$$ 最终输出256位(32字节)的认证码[^2]。 ### Python 实现示例 ```python import hashlib def hmac_sha256(key: bytes, message: bytes) -> bytes: # 块大小 (SHA-256) block_size = 64 # 密钥处理 if len(key) > block_size: key = hashlib.sha256(key).digest() if len(key) < block_size: key += b&#39;\x00&#39; * (block_size - len(key)) # 生成填充常量 ipad = bytes([x ^ 0x36 for x in key]) opad = bytes([x ^ 0x5C for x in key]) # 内部哈希计算 inner_hash = hashlib.sha256(ipad + message).digest() # 外部哈希计算 return hashlib.sha256(opad + inner_hash).digest() # 示例用法 key = b"secret_key" message = b"important_data" signature = hmac_sha256(key, message) print("HMAC-SHA256:", signature.hex()) ``` ### 关键特点 1. **防篡改**:任何消息或密钥的修改都会导致签名完全变化 2. **抗长度扩展攻击**:HMAC 结构有效防御了 SHA-256 的潜在弱点 3. **高效安全**:相比 RSA 等非对称算法,计算开销更低[^1] 4. **密钥依赖**:签名结果与密钥强绑定,未授权方无法伪造 实际应用中常配合时间戳防止重放攻击,并通过 Base64 编码便于传输[^3]。 --- ### 相关问题 1. HMAC-SHA256 如何防止重放攻击? 2. 对比 HMAC-SHA256 和 RSA 签名在 API 认证中的优劣? 3. 密钥长度不足时补零操作的安全性如何保障? 4. HMAC-SHA256 与普通 SHA-256 哈希的主要区别是什么? 5. 如何用 Java 实现 HMAC-SHA256 并添加 Base64 编码? [^1]: HMAC-Sha256 在 API 认证中相比非对称加密更高效且易于管理 [^2]: HMAC 结构通过双重哈希和密钥混淆增强安全性 [^3]: Base64 编码常用于传输二进制签名数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值