Python hashlib模块详解:从原理到实战应用
本文深入解析Python hashlib模块,涵盖MD5、SHA1至SHA512等主流哈希算法的特性与性能对比。详细演示如何通过update、hexdigest等方法进行数据加密,并介绍通过添加随机盐值提升安全性的技巧。结合用户注册登录实战案例,展示如何在实际开发中利用哈希算法保障数据完整性与密码安全。
一、hashlib简介
1. 什么是Hash:
Hash是一种数据摘要算法(不同算法的区别主要在于计算复杂度)。在Python 3.x版本中,hashlib模块取代了早期的md5和sha模块,主要提供了SHA1、SHA224、SHA256、SHA384、SHA512以及MD5等算法的支持。该算法接收输入内容,经过特定运算后生成一串固定的Hash值。
2. Hash值的核心特性(Hash产品具备三大特性):
- 1. 确定性:只要传入的内容相同,生成的Hash值必然一致。这一特性常用于明文传输密码时的文件完整性校验。
- 2. 不可逆性:无法由Hash值反推出原始内容。因此,在存储密码时应仅保存Hash值,严禁在网络中传输明文密码(系统只能根据内容生成Hash值进行比对)。
- 3. 定长性:无论校验内容的体积大小如何,只要使用的Hash算法不变,生成的Hash值长度始终固定。例如,从网络下载文件时进行Hash校验,可确保传输过程中未发生丢包或数据损坏。
MD5是最常用的摘要算法,计算速度极快,生成结果固定为16字节,通常以32位16进制字符串表示。SHA1算法安全性更高,结果为20字节,通常以40位16进制字符串表示。而SHA256和SHA512等算法比SHA1更安全,但计算速度更慢,且生成的摘要长度更长。
二、hash对象的方法
hash.update(arg)
更新hash对象。连续的调用该方法相当于连续的追加更新。例如m.update(a); m.update(b)相当于m.update(a+b)。注意,当数据规模较大的时候,Python的GIL在此时会解锁,用于提高计算速度。
一定要理解update()的作用,由于消息摘要是只针对当前状态产生的,所以每一次update后,再次计算hexdigest()的值都会不一样。
hash.digest()
返回bytes格式的消息摘要
hash.hexdigest()
与digest方法类似,不过返回的是两倍长度的字符串对象,所有的字符都是十六进制的数字。通常用于邮件传输或非二进制环境中。通常我们比较摘要时,比较的就是这个值!
hash.copy()
返回一个hash对象的拷贝
hashlib.new(name[, data])
一个通用的构造方法,name是某个算法的字符串名称,data是可选的bytes类型待摘要的数据。
>>> h = hashlib.new('sha256',b"haha")
>>> h.hexdigest()
'090b235e9eb8f197f2dd927937222c570396d971222d9009a9189e2b6cc0a2c1'
三、hashlib实际操作
1)在执行MD5哈希运算前,必须对数据进行编码处理,否则程序会报错。
import hashlib
obj = hashlib.md5() #构造一个hashlib的对象
obj.update("小马过河") #update对指定字符串进行加密
print(obj)
--------------结果:
obj.update("小马过河")
TypeError: Unicode-objects must be encoded before hashing
2)obj即为生成的hash对象。
import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
print(obj,type(obj))
-------------------结果:
<md5 HASH object @ 0x001C5590> <class '_hashlib.HASH'>
3)获取最终的字符串结果。
import hashlib
obj = hashlib.md5()
obj.update("小马过河".encode("utf-8"))
result=obj.hexdigest()
print(result)
--------------结果:
24f67b0f6d02adc8867d612e0e0fc40a
4)通过添加额外内容增加加密难度。
import hashlib
obj = hashlib.md5("mcw@xiaoma@aaaafffff".encode("utf-8")) #添加一些内容,提高加密复杂度。此处的字符串也要先编码,
obj.update("小马过河".encode('utf-8'))
result = obj.hexdigest()
print(result)
-------------------结果:
b11740508f28e04837f2c0e3a58cf990
5)封装加密函数(包含基础字符处理)。
import hashlib
def get_md5(data): #传参为需要加密的字符串
obj = hashlib.md5("sidrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
val = get_md5('123')
print(val)
--------------结果:
35093270b6352fa9721370b781f7b4d7
四、小小案例
import hashlib
USER_LIST = []
def get_md5(data):
obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
def register():
print('**************用户注册**************')
while True:
user = input('请输入用户名:')
if user == 'N':
return
pwd = input('请输入密码:')
temp = {'username':user,'password':get_md5(pwd)}
USER_LIST.append(temp)
def login():
print('**************用户登陆**************')
user = input('请输入用户名:')
pwd = input('请输入密码:')
for item in USER_LIST:
if item['username'] == user and item['password'] == get_md5(pwd):
return True
register()
result = login()
if result:
print('登陆成功')
else:
print('登陆失败')
------------------------结果:
**************用户注册**************
请输入用户名:小马过河
请输入密码:123456
请输入用户名:N
**************用户登陆**************
请输入用户名:小马过河
请输入密码:123456
登陆成功
到此这篇关于Python基础之hashlib模块详解的文章就介绍到这了,更多相关Python hashlib模块内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









