首先我们要明白日常的Web网页为了保证数据的安全都会对数据的存储进行一些加密,当我需要在此网站验证时就需要对原有的密码以及账号进行加密此时我们就需要用到hashlib这个框架的一些功能,下面我就来更大家介绍一下hashlib的基本用法
hashlib只能加密不能反解,只要有足够的密码串转换成hashlib的字符串就有可能实现密码的破解
首先我们要导入hashlib包
# ### hashlib 模块
import hashlib
import random
# 基本用法
# (1)创建一个md5算法的对象
hs = hashlib.md5()
# (2)把要加密的字符串通过update更新到hs这个对象当中进行运算
"""数据类型需要:二进制字节流"""
hs.update("abcdwW123^".encode("utf-8"))
# (3)返回32位16进制的字符串
res = hs.hexdigest()
print(res,type(res),len(res))
首先常用的实例化hashlib下的md5的类
其次将数据传入update这个方法中此时update里面的数据类型必须是2进制的字节流
当我把参数传入update这个方法之后我们就需要通过hs对象中的另外一个方法进行转换后的调用
hs.hexdigest()此时生成的值就是32位的字符串此时我们已经得到了初始随机的32位字符串
hashlib进阶
何为hashlib的进阶呢?在Web网站的验证中普通的hashlib加密由于密码太简单了所以在服务端会自动对客户端输入进来的密码进行字符串拼接后加密,之后再把数据库的32位字符串取出在进行对比,如果两者对比成功则代表密码验证成功
以下就是常用的hashlib进阶加密的一种操作
# 加盐 (加key => wW123#) # 目的:是用户的密码变得复杂,不容易破解 # 参数是二进制字节流 hs = hashlib.md5("wW123#".encode()) hs.update("abcd".encode()) res = hs.hexdigest() print(res,type(res),len(res)) # 动态加盐 res = str(random.randrange(100000,1000000)) hs = hashlib.md5(res.encode()) hs.update("abcd".encode()) res = hs.hexdigest() print(res)
动态加盐(key)的方式需要记住的是需要在数据库保存随机的动态字符串以备下一次的密码验证时可以取到关键的的盐(key)
hashlib下的sha系列
hashlib下的sha系列所具有的的功能与md5的功能是一样的但速度稍慢,安全性稍微好一点依然需要加盐(key)
以下是sha系列的基本用法
hs = hashlib.sha1()
hs.update("abcd".encode())
res = hs.hexdigest()
print(res , len(res) , type(res))
hs = hashlib.sha512()
hs.update("abcd".encode())
res = hs.hexdigest()
print(res , len(res) , type(res))
基本用法与MD5是一致的
加密扩展hmac系列
相对于hashlib系列下的MD5以及啥系列来说安全性更高,字符串更加难破解
用法为
hmac.new(key,msg)---》key即就是需要增加的盐(key),msg即是所要加密的字符串
以下是hmac的基本用法
# ### hmac
import hmac
"""
hmac 也是加密算法,相对来说,字符串更难破解
"""
key = b"123"
msg = b"abcd"
hm = hmac.new(key,msg)
res = hm.hexdigest()
print(res,len(res))
# 动态加盐
import os
"""urandom 随机返回具有固定长度的二进制字节流 参数:字节流的长度"""
res = os.urandom(32)
print(res,len(res))
key = os.urandom(32)
msg = b"abcd"
hm = hmac.new(key,msg)
res = hm.hexdigest()
print(res)