魔力Python---hashlib
1 什么是hashlib?
hashlib主要提供字符加密功能,包括md5,sha1,sha256,sha512,sha224,sha384算法(md5已经被破解,后两种不经常使用)
哈希算法也称为摘要算法,相同的数据始终得到相同的输出,不同的数据得到不同的输出.
(1)哈希将不可变的任意长度的数据编程具有固定长度的唯一值.
(2)字典的键值对映射关系是通过哈希计算的,哈希存储的数据是散列的(无序)
应用场景:校验(账号密码校验,文件一致性校验)
2 hashlib使用
2.1 hashlib属性和方法
algorithms:列出所有加密算法('md5','sha1','sha224','sha256','sha384','sha512')
digesti_size:产生的散列的字节大小
md5()/sha1():创建一个md5或者sha1加密模式的hash对象
update(arg):用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b),则等于m.update(a+b)
digest():返回摘要,作为二进制数据字符串值
hexdigest():返回摘要,作为十六进制数据字符串值
copy():复制
2.2 hashlib使用简例
以md5算法为例
#引包
import hashlib
def md5():
#创建一个md5算法的对象(可加盐)
hashlib_obj = hashlib.md5()
#若想加盐写hashlib_obj = hashlib.md5('abcd'.encode())
#print(hashlib_obj)
hashlib_obj.update('123'.encode())
#123属于想要被加盐的对象,update中的参数必须是二进制字节流
return hashlib_obj.hexdigest()
#hexdigest返回32位十六进制的字符串(固定长度)
一般加盐之后密码安全性大大提高,只有穷举法才能破解.
3 hashlib实例
3.1 登录验证
import hashlib
#定义一个加密函数,将传入的参数转换成32位的哈希值并返回
def md5(pwd):
md5_password = hashlib.md5("abd".encode())
md5_password.update(pwd.encode())
return md5_password.hexdigest()
#定义一个登录函数,将传入的账号密码与本地密码文件进行匹配,如果匹配到返回True
def login(user,pwd):
with open("database","r",encoding="utf-8") as fp:
for line in fp :
u,p = line.strip().split("|")
if u == user and p == md5(pwd):
return True
#定义一个注册的函数,将用户传入的账号密码写入到本地的密码文件中
def register(user,pwd):
with open("database","w",encoding="utf-8") as fp:
temp = user+ "|" + md5(pwd)
fp.write(temp)
#index菜单,给用户的交互
choice = input("1表示登录, 2表示注册:").strip()
if choice == "2":
user = input("用户名:")
pwd = input("密码:")
register(user,pwd)
elif choice == "1":
user = input("用户名:")
pwd = input("密码:")
r = login(user,pwd)
if r == True:
print("登录成功")
else:
print("登录失败")
else:
print("账号不存在")
3.2 文件比较一致性
import hashlib
def out_md5(src):
# 简单封装
m = hashlib.md5()
m.update(src.encode('utf-8'))
return m.hexdigest()
with open('1.txt', 'r') as f:
src = f.read()
m1 = out_md5(src)
print(m1)
with open('2.txt', 'r') as f:
src = f.read()
m2 = out_md5(src)
print(m2)
if m1 == m2:
print(True)
else:
print(False)
记得,最后输出的是如此,所以文件输出的是一串数字.(参考补充,sha1适用的二进制长度相当大,不要担心被使用完)
bb0c1b519a0a2b8e6c74703e44538c60
43cb091db43a710d85ce45fb202438cd
False
4 补充
md5和sha类算法一样写法.
sha系列中的sha1, sha224, sha2556适用于长度不超过264二进制位的消息。sha384和sha512适用于长度不超过2128二进制位的消息。
现在sha256以上相对安全.
浙公网安备 33010602011771号