hash算法
无论多大的数据传给hash算法得到的都是一个固定长度却唯一的一个字符串;不同的hash算法只是复杂度不同
哈希算法特点
- 只要传入内容一样,得到的哈希值一定相同
- 通过哈希值不能够推导出其原内容
- 只要使用的哈希算法不变,无论校验的内容多大,得到的哈希值长度都是固定的
哈希算法的应用场景
- 做文件下载一致性校验
- 对用户密码进行加密
对指定字符串进行加密
原始字符串加密
import hashlib
obj=hashlib.sha1()
obj.update("xiaofaif小明".encode("utf-8"))
obj.update("李".encode("utf-8"))
res=obj.hexdigest()
print(res)
增加强度的加密手段
import hashlib
obj=hashlib.sha1("abc".encode("utf-8"))
obj.update("xiaofaif小明".encode("utf-8"))
obj.update("李".encode("utf-8"))
res=obj.hexdigest()
print(res)
案例一:注册用户的密码加密:
import hashlib
def passwd_encryp(data,salt):
print("加密功能".center(50,"#"))
obj=hashlib.md5(salt.encode("utf-8"))
obj.update(data.encode("utf-8"))
res=obj.hexdigest()
print(res)
return res
def registry():
print("注册功能".center(50,"#"))
name=input("请输入您的姓名:")
# pass1=input("请输入您的密码:")
if name == "N":
exit()
password=input("请输入您的密码:")
user={"name":name,"password":passwd_encryp(password,"xiaoming")}
user_list.append(user)
def login():
print("登陆功能".center(50,"#"))
name1=input("姓名:")
passwd=input("密码:")
for i in user_list:
if i["name"] == name1 and i["password"] == passwd_encryp(passwd,"xiaoming"):
return True
user_list=[]
registry()
if login():
print("登陆成功")
else:
print("用户名、密码错误")
案例二:保证下载文件的完整性
import hashlib
obj=hashlib.sha224()
with open("a.ini",mode='rb') as f:
for line in f:
obj.update(line)
res=obj.hexdigest()
print(res)
案例三:模拟撞库破解用户密码
import hashlib
def keyset():
i=0
res_set=[]
while i<5:
passwd=input("密码>>")
res_set.append(passwd)
i+=1
return res_set
def hash_collection(data):
collection={}
for passwd in data:
obj=hashlib.sha1()
obj.update(passwd.encode("utf-8"))
res=obj.hexdigest()
collection[passwd]=res
return collection
res1=hash_collection(keyset())
for i in res1:
if res1[i]== "17e0babf0e741a3078a4701ee80ca5826f574ce5":
print("密码为--》",i)
else:
print("碰撞失败")
subprocess
创建子进程,并将进程的输入输出分别输出到管道中,供后续程序使用
原函数应用
import subprocess
res=subprocess.Popen("arp -a",stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE)
print(res.stdout.read().decode("gbk"))
print(res.poll())
print(res.wait())
print(res.terminate())
print(res.pid)
res.stdout.close()
基于原函数封装的函数
subprocess.run("arp -a")
print(subprocess.call('arp -a')) #返回命令的执行结果和执行状态
print(subprocess.check_call('arp -a')) #返回命令的执行结果和状态,异常则抛出
print(subprocess.getstatusoutput('arp -a')) #接受字符串形式的命令,返回一个元组格式的执行结果
print(subprocess.getoutput('ipconfig /all'))