Python3 hashlib模块MD5加密详解与中文编码处理
本文详解Python3中hashlib库的MD5加密用法。针对Python3标准库变化,介绍md5()及SHA系列算法创建哈希对象的方法。重点解析中文加密时的UTF-8、GBK等编码转换,以及hash.update()拼接数据的特性,提供完整代码示例与算法列表查询方式。
在Python3的标准库中,MD5算法已不再直接作为独立模块存在,而是统一归入hashlib标准库。该库涵盖了SHA1、SHA224、SHA256、SHA384、SHA512以及MD5等多种哈希加密算法。
网络上关于Python MD5加密的教程往往存在版本过时或表述不清的问题。为确保准确性,建议直接查阅官方文档,并在此整理MD5的具体使用方法。
学习编程知识时,阅读官方文档是最有效的途径之一。尽管文档多为英文,可能存在一定门槛,但习惯阅读英文技术文档是开发者的重要能力。
建议直接阅读Python3的hashlib官方文档:
https://docs.python.org/3/library/hashlib.html?highlight=hashlib#credits
hashlib库提供了多种哈希算法,包括sha1()、sha224()、sha256()、sha384()、sha512()、blake2b()、blake2s()以及md5()。这些方法通过统一接口返回一个哈希对象,例如使用sha256()可创建SHA-256哈希对象。
进行MD5加密时,需调用md5()方法:
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b'123')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'
# 或者可以这样
>>> hashlib.md5(b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'
# 也可以使用hash.new()这个一般方法
>>> hashlib.new('md5', b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'
上述示例针对英文文本进行MD5加密。若对中文进行加密,直接套用上述代码会报错,原因在于字符编码转换问题,需按以下方式处理:
>>> import hashlib >>> data = '你好' >>> hashlib.md5(data.encode(encoding='UTF-8')).hexdigest() '7eca689f0d3389d9dea66ae112e5cfd7'
此处先将数据转换为UTF-8格式。使用在线工具对比加密结果发现,部分MD5加密工具并非默认使用UTF-8格式进行加密。
经测试,目前支持转换为UTF-8、GBK、GB2312、GB18030编码。由于GBK、GB2312和GB18030均针对汉字编码,因此使用这些编码进行MD5加密的结果一致,且编码名称不区分大小写。
除上述编码格式外,可能还存在其他编码方式,目前尚未发现,欢迎补充。
参考以下实例:
>>> hashlib.md5('你好'.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'
>>> hashlib.md5('你好'.encode(encoding='GBK')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'
>>> hashlib.md5('你好'.encode(encoding='GB2312')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'
>>> hashlib.md5('你好'.encode(encoding='GB18030')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'
若仅需查询MD5的写法,查看上述实例即可;
若是Python新手,希望了解这些方法的具体含义和用法,请继续阅读以下内容。
解析
1. hashlib.new(name[, data])方法
这是一个通用方法。
name参数传入哈希加密算法的名称,例如md5;
data参数传入需要加密的数据,该参数可忽略,后续可在update()方法中传入。
>>> m = hashlib.new('md5')
>>> m.update(b'123456')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'
可以使用hashlib.algorithms_guaranteed或hashlib.algorithms_available这两个内置属性来查看hashlib支持哪些加密算法。
hashlib.algorithms_guaranteed是一个集合,包含所有平台上保证被hashlib模块支持的哈希算法名称;
hashlib.algorithms_available是一个集合,包含当前运行的Python编译器可用的哈希算法名称。由于OpenSSL的原因,其中可能出现重复的哈希算法名称。
hashlib.algorithms_guaranteed是hashlib.algorithms_available的子集。
参考以下输出:
>>> hashlib.algorithms_guaranteed
{'sha3_384', 'md5', 'blake2s', 'sha3_512', 'blake2b', 'shake_128', 'sha384', 'sha3_256', 'sha1', 'shake_256', 'sha3_224', 'sha512', 'sha256', 'sha224'}
>>> hashlib.algorithms_available
{'whirlpool', 'ripemd160', 'dsaEncryption', 'sha1', 'SHA224', 'sha512', 'sha256', 'SHA512', 'blake2s', 'blake2b', 'SHA256', 'sha384', 'sha3_256', 'SHA384', 'sha', 'sha224', 'RIPEMD160', 'shake_128', 'sha3_512', 'SHA', 'MD5', 'shake_256', 'DSA', 'sha3_384', 'DSA-SHA', 'ecdsa-with-SHA1', 'md5', 'SHA1', 'dsaWithSHA', 'md4', 'MD4', 'sha3_224'}
2. hash.update(arg)
传入arg对象来更新哈希对象。必须注意的是,该方法只接受byte类型,否则会报错。这就是要在参数前添加b来转换类型的原因:
>>> m = hashlib.md5()
>>> m.update('123456')
TypeError: Unicode-objects must be encoded before hashing
同时要注意,重复调用update(arg)方法,是将传入的arg参数进行拼接,而不是覆盖。必须注意这一点,因为在不熟悉update()原理时,很容易因此出错。
也就是说,m.update(a); m.update(b) 等价于m.update(a+b),参考以下例子:
>>> m = hashlib.md5() >>> m.update(b'123') >>> m.hexdigest() '202cb962ac59075b964b07152d234b70' >>> m.update(b'456') >>> m.hexdigest() 'e10adc3949ba59abbe56e057f20f883e' >>> hashlib.md5(b'123456').hexdigest() 'e10adc3949ba59abbe56e057f20f883e'
3. hash.hexdigest()
众所周知,在英语中hex代表十六进制,因此该方法是将hash中的数据转换为十六进制字符串,其中仅包含十六进制数字。另外还有hash.digest()方法。
以上这篇Python3中的MD5加密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









