hashlib的使用

hashlib的使用
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的(通常为32位的)数据串(通常用16进制表示)。
1.md5
2.SHA系列:sha1,sha224,sha256,sha512

关于数据安全的一些知识:
加密,密码,锁 凯撒密码 算法
加密分类
-对称加密:数据的加密和解密用相同的密钥
-非对称加密:加密和解密用不同的密匙,公钥用于数据加密,私钥用于解密
-单向加密:只能加密,不能解密(即hash算法)

Hash :散列算法,摘要算法,哈希算法

任意长度的输入通过散列算法变换成固定长度的输出。压缩,有损的
特点: 32位hash算法 武汉大学 女博士(破解了) 然后美国又推出64位
-不可逆
-定长输出(输入不变,输出不变)
-抗修改性 输入的微小改变,哪怕只是一个bit位的修改,引起巨大的变化!!!
-强碰撞性:很难找到 两端不同的数据,使他们的hash值相等,几乎是不可能

import hashlib
info = '我最帅'
#转化为字节数据
a = info.encode()
#hash算法只接受字节数据
m = hashlib.md5(a)
print(m) #m是一个md5 Hash object(算法对象)

#使用摘要算法
res1 = m.hexdigest()# 常用方式  用摘要算法输出长度为32的字符串(16进制表示,)
res2 = m.digest()# 输出字节数据,但这个字节和前面的字节数据a又不一样
print(res1)
print(res2)
print(a)


# 还有一种用法  读大文件时,可以一行一行的读,或者规定一次读取多少字节,防止内存无限被占用
# 第一步新建一个算法对象
md5 = hashlib.md5()
with open ("hash.txt","rb",) as f: #默认utf-8编码,注意不要用windows的记事本创建txt文件!

	for line in f:
		md5.update(line)#通过for循环不停的更新文件中的line,生成md5 Hash object,并且返回到md5当中
	res = md5.hexdigest()#通过摘要算法,返回长度为32的16进制数据
	print(res)
	
exa = "你好\r\n我很好" #读取文件中有换行,要跟他一样,此处也要加上换行符
print(exa)
print(exa.encode()) #此种写法默认用utf-8编码
x= hashlib.md5(exa.encode())
jieguo = x.hexdigest()
print(jieguo)

最后会发现exa和jieguo的32位码完全相同。

在这里插入图片描述

通过输入用户名和密码,用hash算法算密码,返回一个32位码,和数据库中储存的该用户名对应的32位码对比,完全一致则登陆成功

还有更严格的加密方式,比如md5前,密码+随机码 加盐 防止黑客盗取密码

用户名+密码+盐,把这个整体用摘要算法返回一个32为码,更难破解。(所以最好用户名不重复,这样32位码就完全没有重复的了)

可以写一个登陆系统:
name password
xinlan 123456
xinlan e10adc3949ba59abbe56e057f20f883e

import hashlib

user = input("请输入用户名:")
password = input("请输入密码:")


#这里是数据库,里面包含用户名和密码hash值信息
db = {
    'xinlan': 'e10adc3949ba59abbe56e057f20f883e',
    'budong': '21218cca77804d2ba1922c33e0151105',
    'tuple': '52c69e3a57331081823331c4e69d3f2e'
}

def login(user, password):
	
	if user not in db.keys():
		print("用户名不存在")
	else:
		m = hashlib.md5(password.encode())
		
		if db[user] == m.hexdigest():
			print("登陆成功!")
		else:
			print("密码错误")

	
login(user,password)

其中三个用户名的密码分别为123456,888888,999999. 可以自己试着登陆一下。

<think>好的,用户想了解如何使用Python的hashlib库,需要我提供使用方法和示例教程。首先,我得回忆一下hashlib的基本功能和常用方法hashlib主要用于加密,比如MD5、SHA1等算法。用户可能需要知道如何创建hash对象,更新数据,获取摘要,以及处理不同编码的数据。 记得用户提到的引用里有提到支持的算法,比如MD5、SHA系列,所以应该先列出这些算法。然后,分步骤讲解,比如创建hash对象,使用update方法,处理字符串和文件的哈希,可能还要提到hexdigest和digest的区别。 需要注意用户可能遇到的常见问题,比如字符串编码问题,得提醒他们使用encode()方法。还有文件哈希时的分块读取,避免内存问题。示例部分要简单明了,比如MD5和SHA256的字符串和文件示例,这样用户可以直接复制使用。 还要考虑用户可能的进阶需求,比如使用new()方法动态选择算法,或者不同算法的安全性比较。比如MD5已经不推荐用于安全用途,应该建议使用SHA256等更安全的算法。 最后,生成相关问题,帮助用户进一步学习,比如如何提高哈希计算效率,处理大文件的最佳实践,或者如何避免彩虹表攻击。确保引用正确,根据用户提供的引用资料,引用[1]、[2]、[3]都涉及hashlib的基本信息和用法,所以在适当的地方标注引用。 检查是否符合系统级指令:行内公式用$,独立公式单独成段,中文回答,结构清晰。这里可能不需要数学公式,但如果有提到算法原理的话可能需要,但用户问题主要是代码示例,所以可能不用。确保代码用正确格式,单独成块,语法正确。 总结步骤: 1. 介绍hashlib的作用和包含的算法。 2. 分步骤说明使用方法:创建对象、更新数据、获取摘要。 3. 字符串哈希示例,强调编码问题。 4. 文件哈希示例,分块读取。 5. 其他注意事项,如算法选择、安全性。 6. 示例代码,可能两个例子:字符串和文件。 7. 相关问题生成。 现在组织语言,确保清晰易懂,符合用户需求。</think>### Python hashlib使用方法教程 #### 一、hashlib库简介 hashlib是Python标准库,提供多种安全散列算法(如MD5、SHA1、SHA256等),用于生成数据的唯一哈希值[^2][^3]。常见应用场景包括: - 密码存储 - 数据完整性验证 - 文件唯一性校验 #### 二、核心方法说明 1. **创建哈希对象** ```python import hashlib md5 = hashlib.md5() # MD5算法 sha256 = hashlib.sha256() # SHA256算法 ``` 2. **更新数据** ```python md5.update(b"Hello") # 必须传入bytes类型数据 md5.update(" 世界".encode('utf-8')) # 字符串需要编码 ``` 3. **获取摘要** ```python hex_digest = md5.hexdigest() # 返回16进制字符串 byte_digest = sha256.digest() # 返回字节数据 ``` #### 三、使用示例 1. **字符串哈希计算** ```python def string_hash(text, algorithm='sha256'): hasher = hashlib.new(algorithm) hasher.update(text.encode('utf-8')) return hasher.hexdigest() print(string_hash("Hello Python")) # 输出: 9d1b0...(64位哈希值) ``` 2. **文件哈希验证** ```python def file_hash(filepath, algorithm='md5', chunk_size=8192): hasher = hashlib.new(algorithm) with open(filepath, 'rb') as f: while chunk := f.read(chunk_size): hasher.update(chunk) return hasher.hexdigest() print(file_hash("test.zip")) # 输出文件MD5值 ``` #### 四、注意事项 1. **编码问题**:字符串必须编码为bytes,推荐使用`encode('utf-8')` 2. **算法选择**: - MD5:快速但存在碰撞风险,适合非敏感场景 - SHA256:安全性更高,推荐敏感数据使用 3. **大文件处理**:使用分块读取避免内存溢出 #### 五、进阶用法 ```python # 动态算法选择 algorithms = hashlib.algorithms_available # 查看所有可用算法 print(algorithms) # 输出: {'sha3_256', 'md5', 'blake2s'...} # 带密钥的哈希 hmac_hash = hashlib.blake2b(key=b'secret') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值