Python3 从零单排11_hashlib&subprocess

  hash在当前运行程序中,固定的被hash字符,hash后的值不会变,但是重启程序后又会变化 hash后的值,不可逆,不可反推,即无法破解,基于此特性,可以用作密码保存。

 

  MD5讯息摘要演算法(MD5 Message-Digest Algorithm),密码杂凑函数,可产生一个128位的散列值(hash value),用于确保信息传输完整一致:

  1.输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);

  2.不同的输入得到的不同的结果(唯一性);跟hash不一样,不论在哪里md5,固定的被md5的值得到的加密后的值永远不变

 

  MD5特点 不可逆,可以对文件直接进行md5,而且很快(比如上G的视频文件)

  压缩性:任意长度的数据,算出的MD5值的长度都是固定的

  容易计算:从原数据计算出MD5值很容易

  抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大

  强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

 

  MD5用途 防止被篡改,防止直接看明文,防止抵赖(数字签名)

  用法比较简单:

import hashlib

m
= hashlib.md5() a = m.update(b"xg123") print(m.hexdigest()) #以16进制输出密文,每两位十六进制代表一个字节,密文是32位十六进制,所以32*4=128 print(m.digest()) #以bytes展示密文

  subprocess模块

  跟操作系统进行交互,os.system()类似 # subprocess模块,等于是让操作系统开了一个新的进程,但进程之间的数据是不能共享的,也就是命令执行得到的结果,python这个进程是拿不到的 # 那么这里想拿到命令执行结果就需要用到操作系统合格中间管道了,类似与复制粘贴,先复制内容到操作系统内存,再从操作系统内存拷贝出来。

  subprocess模块有三个防范  run、call、Popen 其中call和run类似,这里不赘述。

import os,subprocess


print(os.system("uname -a"))  #返回的数值表示命令执行状态,0表示执行成功,非0表示失败  操作系统里可以用echo $? 输出上一条命令的执行状态
print(os.popen("uname -a").read())  #popen返回的值是命令执行结果,read()方法读取返回的结果
print(os.popen("du -h").read())  #popen返回的值是命令执行结果,read()方法读取返回的结果

# run方法 a = subprocess.run(["df","-h"]) #直接执行,不指定操作系统管道 print(a.stdout) #因为执行的时候没指定操作系统管道接收命令执行结果,所以这里读取的时候会报错 a = subprocess.run(["df","-h"],stdout=subprocess.PIPE,stderr=subprocess.PIPE) #指定操作系统管道 print(a.stdout) #可以拿到执行结果 print(a.stderr) #有错的话会在这里现实 # 不指定check,进程执行命令,选项出错的时候,python不会raise异常 a = subprocess.run(["df","-hasd"],stdout=subprocess.PIPE,stderr=subprocess.PIPE) print(a.stdout) #输出为空 print(a.stderr) #这里会打印异常情况 a = subprocess.run(["df","-hasd"],stderr=subprocess.PIPE,check=True) #指定check,进程执行命令选项出错的时候,python直接raise异常 # 当有管道符的时候,命令不能再用list,直接写成字符串,但是需要指定shell=True a = subprocess.run(["df -h | grep Size"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) print(a.stdout)
# Popen方法 后台运行程序,和python主程序并行运行,不会影响python主程序的运行 a = subprocess.run("sleep 10",shell = True,stdout=subprocess.PIPE) #python主程序和shell命令是串行的,这里等待10s,python主程序才继续往下运行 a = subprocess.Popen("sleep 10",shell = True,stdout=subprocess.PIPE) #直接运行下一句了,和python主程序并行 print(a.poll()) #获取命令执行结果,不影响python主程序,两边是并行的 def sayhi(): print("run... HELLO!") a = subprocess.Popen("sleep 10",shell = True,stdout=subprocess.PIPE,preexec_fn=sayhi) #preexec_fn在运行shell命令前,执行函数 a = subprocess.Popen("echo $PWD;sleep 2",shell = True,cwd="/tmp",stdout=subprocess.PIPE,preexec_fn=sayhi) #cwd指定运行shell命令的目录 a = subprocess.Popen("echo $PWD;sleep 2",shell = True,stdout=subprocess.PIPE,preexec_fn=sayhi) #cwd不指定则在启动python文件的当前目录 a = subprocess.Popen("echo $PWD;sleep 100",shell = True,stdout=subprocess.PIPE,preexec_fn=sayhi) a.wait() #等待命令执行完再继续往下走 print(a.stdout.read()) print(a.pid) #获取进程id a.kill() #杀掉进程 类似于 os.kill(pid,signal) a.terminate() #终止进程 # communicate 可以和进程进行交互。发送数据到stdin,并从stdout接收输出,然后等待任务结束。但是只能交互一次 a = subprocess.Popen('python3 guess_age.py',stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE,shell=True) a.communicate(b'22') a.send_signal() #发信号

 

posted @ 2018-12-05 19:13  毛斯钢  阅读(149)  评论(0编辑  收藏  举报