40.Python加密模块
2021/11/29 20:37:49
本文主要是介绍40.Python加密模块,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 1.加密模块
- 1.1加密
- 1.2碰撞理论
- 1.3加盐处理
- 1.4hashlib
- 1.5md方法
- 1.6加密使用
- 1.7分段传入
- 1.8碰撞破密
- 1.9加盐处理
- 2.文件校验
- 2.1检验文件一致性
- 2.2大文件md5校验
- 3.比特流技术概念
- 4.日志模块
- 4.1日志级别
- 4.2详解
1.加密模块
1.1加密
加密:将明文数据通过一系列算法变成密文的数据,以此保证数据的安全性. 在IT互联网没有绝对的安全,只有更加的安全. 涉及到密码存储:存储的是密文,只有用户自己知道明文. 用户输入的明文经过前/后端程序转为密文进行存储.
1.2碰撞理论
数据泄露:密文算法的设计断绝密文转明文的方法.别人也只能拿到密文.
碰撞理论 通过穷举字符组合的方式得到字符, 在翻译成密文,以此创建了明文密文对应查询数据库. 明文数据只要是相同的,无论如何传递加密都是一样的. 输入的密码加密之后比对加密之后的结果,如果存在则可以找到明文. ps: 登入程序时,输错密码多次后会限制一个时间内的登入, 就是为了防止'人工智能'写字典破解密码.
1.3加盐处理
加盐处理:在对明文数据加密处理前添加一些干扰项. 自定义的盐 + 明文 == > 算法加密 == 处理后的结果 动态加盐:在对明文数据加盐之前添加动态的干扰项. 不会重复的字符 + 明文 == > 算法加密 == 处理后的结果 eg:当前时间 uuid永远不会重复的字符串...
1.4hashlib
hashlib是Python备内置的加密算法模块. 包含: 1.md系列 2.sha系列 3.base系列 4.hmac系列 密文越长使用的算法越复杂,对应破解算法的难度越高. 产生的复杂的算法,占用的资源越多,基于网络发送需要占据的数据越大. 具体使用什么算法取决于项目的要求,一帮情况下md5足够.
1.5md方法
.md5() 确定md5算法并实例化一个对象. .update() 需要计算的值,只能接受bytes类型数据. 字符转bytes类型方式: 1.纯数字和字母 b'xxx' 2.'xxx'.encode('utf8') 3.bytes('xxx', 'utf8') .hexdigest() 得到加密之后的值.
1.6加密使用
# 导入hashlib模块 import hashlib # 先确定算法类型(md5) md5 = hashlib.md5() print(md5) # <md5 HASH object @ 0x00000205E966F9E0> # 更新值传递给md算法 md5.update(b'hello word') # 获取加密之后的密文数据 --> str res = md5.hexdigest() print(res, type(res)) # 13574ef0d58b50fab38ec841efe39df4 <class 'str'>
1.7分段传入
明文数据只要是相同的那么无论如何传递,结果都一样的.
# 导入hashlib模块 import hashlib md5_1 = hashlib.md5() md5_2 = hashlib.md5() md5_1.update(b'abc123') md5_2.update(b'abc') md5_2.update(b'123') print(md5_1.hexdigest()) print(md5_2.hexdigest()) """ e99a18c428cb38d5f260853678922e03 e99a18c428cb38d5f260853678922e03 """
1.8碰撞破密
# 导入hashlib模块 import hashlib md5 = hashlib.md5() md5.update('123'.encode('utf8')) res = md5.hexdigest() print(res) # 202cb962ac59075b964b07152d234b70
# 导入hashlib模块 import hashlib import random def get_md5(pwd): md5 = hashlib.md5() md5.update(pwd.encode('utf8')) res = md5.hexdigest() return res # 碰撞破密 while True: # 输入的密码 pwd = input('输入密码>>>:') pwd_md5 = get_md5(pwd) while True: pwd_list = ['1', '2', '3', '4', '5', '6'] random.shuffle(pwd_list) my_pwd_str = ''.join(pwd_list) # 洗牌 my_pwd_md5 = get_md5(my_pwd_str) if my_pwd_md5 == pwd_md5: print('找到密码了,密码是%s' % pwd_list) # 123456的密码就是秒破 break
1.9加盐处理
# 导入hashlib模块 import hashlib import uuid uid1 = uuid.uuid1() print(uid1, type(uid1)) uid1 = str(uid1) print(uid1, type(uid1)) pwd = input('输入你的密码>>>:') md5 = hashlib.md5() md5.update(pwd.encode('utf8')) md5.update(uid1.encode('utf8')) res = md5.hexdigest() print(res) """ dc65ac64-50f1-11ec-ac0c-b025aa345648 <class 'uuid.UUID'> dc65ac64-50f1-11ec-ac0c-b025aa345648 <class 'str'> 输入你的密码>>>:123 eac5ab63c0dd6698cf33a92ab159073a """
2.文件校验
2.1检验文件一致性
1.文件 --> 加密 --> 密文 2.下载文件处提供密文或一同下载 3.下载到电脑上后,按说明按通过算法 再计算一次检验密文是否一致. 4.如果密文不一样则文件被改动.否则正常. (哪怕修改一个字符密码计算结果都不一样)
import hashlib data = 'abc123456789def' # md5 加密 def get_md5(res): md5 = hashlib.md5() md5.update(res.encode('utf8')) data_md5 = md5.hexdigest() return data_md5 print(get_md5(data)) # a4267ce560cd8d399c14d18bb13c4022 # 创一个文件 with open('a.txt', mode='wt', encoding='utf8') as f0: f0.write(data)
手动修改一个字符
# 读取 with open('a.txt', mode='rt', encoding='utf8') as f1: read_dita = f1.read() print(get_md5(read_dita)) # 73067a2947f7b7f5611fffd9b0a85a4a
2.2大文件md5校验
文件不是很大的情况下,可以蒋所有文件内部全部加密处理, 但如果文件特别大全部加密处理相当耗时耗资源. 处理方案: 针对打文件 可以使用切片读取的方式 随机切几个位置抽取做加密. 1.获取玩文件总大小 os.path.getsize 字节数 2.指定分片读取策略(读几段 每段几个字节) 0, len//4 , len//2, len 开头 四分之1出 二分之1处 末尾
3.比特流技术概念
比特流技术 ---> 迅雷 就近原则: 你电脑有下载者需要的数据 某的用户就近的话,可能从你电脑中读取数据进行下载. 断点续传: 获取当前下载文件的的字节数,在从这个点开始下载.
4.日志模块
4.1日志级别
logging模块
日志有五个级别() 1 .debug() 10 2 .info() 20 3 .waring() *** 30 默认 4 .eroor() **** 40 5 .critical ***** 50 默认记录的级别在30及
4.2详解
方法: .getLogger('xxx') 产生日志对象 .filter() 负责过滤日志 .FileHandler('a1.log',encoding='utf8') 日志产生的位置 .StreamHandler() 产生到终端 .formatter() 日志的格式 .addHandler() 绑定输出的 .setFormatter() 绑定输出格式 .setLevel() 设置等级 .debug() 写入日志
# 不要运行没效果的代码. import logging # 1 .getLogger对象: 负责产生日志 logger = logging.getLogger('程序运行记录') # 2 .filter对象: 负责过滤日志(用不上,直接忽略掉) # 3 .Handler: 负责日志产生的位置 hd_f1 = logging.FileHandler('log1.log', encoding='utf8') # 文件的路径 与 编码格式 hd_f2 = logging.FileHandler('log2.log', encoding='utf8') hd_p = logging.StreamHandler() # 产生在终端 # 4 .formatter 对象:负责日志的格式 fm1 = logging.Formatter( fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', ) fm2 = logging.Formatter( fmt='%(asctime)s - %(name)s %(message)s', datefmt='%Y-%m-%d', ) # 5 Handler绑定对象 logger.addHandler(hd_f1) logger.addHandler(hd_f2) logger.addHandler(hd_f1) # 6 绑定Formatter对象 hd_f1.setFormatter(fm1) hd_f2.setFormatter(fm2) hd_p.setFormatter(fm1) # 7 设置日志等级 限制下面的输出 logger.setLevel(30) # 8 设置日志 logger.debug('第一个日志文件')
这篇关于40.Python加密模块的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-08有遇到过吗?同样的规则 Excel 中 比Python 结果大
- 2024-03-30开始python成长之路
- 2024-03-29python optparse
- 2024-03-29python map 函数
- 2024-03-20invalid format specifier python
- 2024-03-18pool.map python
- 2024-03-18threads in python
- 2024-03-14python Ai 应用开发基础训练,字符串,字典,文件
- 2024-03-13id3 algorithm python
- 2024-03-13sum array elements python