23、hashlib和加盐+subprocess模块

hash算法

	无论多大的数据传给hash算法得到的都是一个固定长度却唯一的一个字符串;不同的hash算法只是复杂度不同

哈希算法特点

  1. 只要传入内容一样,得到的哈希值一定相同
  2. 通过哈希值不能够推导出其原内容
  3. 只要使用的哈希算法不变,无论校验的内容多大,得到的哈希值长度都是固定的

哈希算法的应用场景

  1. 做文件下载一致性校验
  2. 对用户密码进行加密
对指定字符串进行加密
原始字符串加密
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'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据工匠大壮

请狠狠粗暴的爱我!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值