Python hashlib模块:哈希算法、编码处理与HMAC应用详解
hashlib是Python标准库中用于安全哈希与消息摘要的核心模块,整合了MD5、SHA1至SHA512等多种算法。本文通过具体代码示例,解析字符串编码转换、哈希对象状态管理以及HMAC密钥认证协议在Python及其他语言中的实现方式。
hashlib模块基础与算法支持
hashlib模块提供了多种不可逆的哈希签名方法,包括MD5、SHA1、SHA224、SHA256、SHA384和SHA512。这些算法广泛应用于数据完整性校验与身份认证场景。使用hashlib时,核心原则是加密对象必须为二进制编码(bytes),直接传入Unicode字符串将导致类型错误。
常见哈希算法实现
以下代码展示了使用hashlib生成不同算法哈希值的完整流程。通过实例化对应的算法对象(如md5、sha1等),调用update方法传入编码后的字符串,最后通过hexdigest()获取十六进制摘要。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#pyversion:python3.5
#owner:fuzj
import hashlib
# ######## md5 ########
string = "beyongjie"
md5 = hashlib.md5()
md5.update(string.encode('utf-8')) #注意转码
res = md5.hexdigest()
print("md5加密结果:",res)
# ######## sha1 ########
sha1 = hashlib.sha1()
sha1.update(string.encode('utf-8'))
res = sha1.hexdigest()
print("sha1加密结果:",res)
# ######## sha256 ########
sha256 = hashlib.sha256()
sha256.update(string.encode('utf-8'))
res = sha256.hexdigest()
print("sha256加密结果:",res)
# ######## sha384 ########
sha384 = hashlib.sha384()
sha384.update(string.encode('utf-8'))
res = sha384.hexdigest()
print("sha384加密结果:",res)
# ######## sha512 ########
sha512= hashlib.sha512()
sha512.update(string.encode('utf-8'))
res = sha512.hexdigest()
print("sha512加密结果:",res)执行上述代码后,将得到各算法对应的十六进制摘要结果:
md5加密结果: 0e725e477851ff4076f774dc312d4748 sha1加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f sha256加密结果: 1e62b55bfd02977943f885f6a0998af7cc9cfb95c8ac4a9f30ecccb7c05ec9f4 sha384加密结果: e91cdf0d2570de5c96ee84e8a12cddf16508685e7a03b3e811099cfcd54b7f52183e20197cff7c07f312157f0ba4875b sha512加密结果: 3f0020a726e9c1cb5d22290c967f3dd1bcecb409a51a8088db520750c876aaec3f17a70d7981cd575ed4b89471f743f3f24a146a39d59f215ae3e208d0170073
字符串编码与错误处理
在Python 3中,hashlib要求输入数据必须是字节串。若直接传入字符串,会抛出TypeError。解决此问题主要有两种方法:使用字符串的encode()方法或bytes()构造函数。
编码转换示例
以下代码对比了直接传入字符串导致的错误,以及使用encode和bytes两种正确转换方式:
sha1 = hashlib.sha1()
sha1.update(string)
res = sha1.hexdigest()
print("sha1加密结果:",res)
TypeError: Unicode-objects must be encoded before hashing正确的转换方式如下:
shaa1 = hashlib.sha1()
shaa1.update(string.encode('utf-8'))
res = shaa1.hexdigest()
print("sha1采用encode转换加密结果:",res)shab1 = hashlib.sha1()
shab1.update(bytes(string,encoding='utf-8'))
res = shab1.hexdigest()
print("sha1采用byte转换的结果:",res)两种方法生成的哈希结果一致:
sha1采用encode转换加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f sha1采用byte转换的结果: 458d32be8ea38b66300174970ab0a8c0b734252f
update方法特性与密钥加密
hashlib对象的update()方法支持多次调用,其效果等同于将所有参数拼接后一次性传入。此外,通过初始化时传入密钥(key),可以实现更安全的哈希计算,以抵御撞库攻击。
累积更新与密钥加密
以下代码演示了update的累积特性及添加自定义key的加密方式:
m = hashlib.md5()
m.update('a'.encode('utf-8'))
res = m.hexdigest()
print("第一次a加密:",res)
m.update('b'.encode('utf-8'))
res = m.hexdigest()
print("第二次b加密:",res)
m1 = hashlib.md5()
m1.update('b'.encode('utf-8'))
res = m1.hexdigest()
print("b单独加密:",res)
m2 = hashlib.md5()
m2.update('ab'.encode('utf-8'))
res = m2.hexdigest()
print("ab单独加密:",res)输出结果验证了累积更新等效于拼接:
第一次a加密: 0cc175b9c0f1b6a831c399e269772661 第二次b加密: 187ef4436122d1cc2f40dc2b92f0eba0 b单独加密: 92eb5ffee6ae2fec3ad71c777531578f ab单独加密: 187ef4436122d1cc2f40dc2b92f0eba0
通过初始化时指定key,可以生成不同的哈希值,增加安全性:
low = hashlib.md5()
low.update('ab'.encode('utf-8'))
res = low.hexdigest()
print("普通加密:",res)
high = hashlib.md5(b'beyondjie')
high.update('ab'.encode('utf-8'))
res = high.hexdigest()
print("采用key加密:",res)
输出结果:
普通加密: 187ef4436122d1cc2f40dc2b92f0eba0
采用key加密: 1b073f6b8cffe609751e4c98537b7653HMAC协议与多语言实现
HMAC(基于密钥的Hash算法认证协议)利用公开Hash函数和私有密钥生成鉴别码,常用于接口Token验证。以下展示了Python、PHP、C++及Shell中HMAC-SHA1的实现方式。
Python实现
Python中可使用hmac模块结合hashlib和base64实现:
import hmac
import hashlib
import base64
hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip()PHP实现
PHP中使用hash_hmac函数:
base64_encode(hash_hmac("SHA1",clientStr,Token , true))C++ (OpenSSL)实现
C++中通过OpenSSL库调用HMAC函数:
HMAC( EVP_sha1(),
/*key data*/ strKey.data(),
/*key len*/ strKey.size(),
/*data */(unsigned char*) strRandom.data(),
/*data len*/ strRandom.size(), digest, &digest_len))Shell实现
在Shell脚本中,可利用openssl命令结合base64编码:
echo -n '3f88a95c532bea70' | openssl dgst -hmac '123' -sha1 -binary | base64
以上代码展示了不同语言环境下HMAC-SHA1的基本用法。请注意,涉及外部输入拼接的代码在生成生产环境Token时需严格验证输入合法性,防止注入风险。
以上就是Python中hashlib模块用法的详细内容,更多关于Python哈希加密与HMAC实现的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









