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位码完全相同。

hashlib的使用_第1张图片

通过输入用户名和密码,用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. 可以自己试着登陆一下。

你可能感兴趣的:(Python学习笔记)