hashlib模块

加密:将明文数据通过一系列算法变成加密文数据(目的是为了让数据更加安全)

加密算法:md系列,sha系列,base系列,hmac系列

1 import hashlib
2 
3 # 先确定算法类型(md5普遍使用)
4 md5 = hashlib.md5()
5 # 将明文数据传递给md5算法(update只能接受bytes类型数据)
6 md5.update(b'123')
7 # 获取加密之后的密文数据(没有规则的一连串数据)
8 res = md5.hexdigest()
9 print(res)

加密之后的密文数据是没有办法反解密成明文数据的。

市面上的破解其实就是提前算出一系列明文对应的密文,之后对比密文获取明文。

①明文数据是要相同,那么无论如何传递加密结果肯定是一样的

 

1 # 1.先确定算法类型(md5普遍使用)
 2 md5 = hashlib.md5()
 3 # 2.将明文数据传递给md5算法(update只能接受bytes数据类型)
 4 md5.update(b'hellojason123')
 5 res = md5.hexdigest()
 6 print(res)  # 4bd388611b31c548eedef14b16c9868c
 7 md5.update(b'hello')
 8 md5.update(b'jason')
 9 md5.update(b'123')
10 res1 = md5.hexdigest()
11 print(res1)  # 4bd388611b31c548eedef14b16c9868c

②明文数据越长表示内部对应的算法越复杂,越难被正向破解。

1 # 先确定算法类型(md5普遍使用)
2 md5 = hashlib.sha1()
3 # 再通过明文数据传递给md5算法(update只能接受bytes)
4 md5.update(b'helloword123')
5 res = md5.hexdigest()
6 print(res)  # 0c2666238e9f1e65a17f2611285ce95c059d9a76

密文越长表示算法越发越复杂 对应的破解算法难度越高,同时越复杂的算法需要的消耗的资源就越多,密文越长基于网络发送的需要占用的数据就越大。

③涉及到用户密码存储,其实都是密文,只要用户自己知道铭文是什么

1 """
2     1.内部程序员无法得知明文数据
3     2.数据泄露也无法得知明文数据
4 ATM购物车练习 用户密码采取的就是密文存取
5 """

④加盐处理

1 # 在对明文数据加密处理过程前添一些干扰项                    
 2 # 先确定使用的算法(md5最普遍)                       
 3 md5 = hashlib.md5()                      
 4 # 将明文数据传递给md5                            
 5 md5.update(b'helloword')                 
 6 # 加盐(干扰项)                                
 7 md5.update('公司内部自己定义的盐'.encode('utf8'))  
 8 # 真实数据                                   
 9 md5.update('12345'.encode('utf8'))       
10 # 获取加密后的密文数据(没有规则的一串随机数)                 
11 res = md5.hexdigest()                    
12 print(res)

⑤动态加盐

1 """                                                                  
 2 在对明文数据做加密处理过程前添加一些变化的干扰项                                             
 3 """                                                                  
 4 import hashlib                                                       
 5 # 1.先确定算法类型(md5普遍使用)                                                 
 6 md5 = hashlib.md5()                                                  
 7 # 2.将明文数据传递给md5算法(update只能接受bytes类型数据)                               
 8 md5.update('123'.encode('utf8'))                                     
 9 # 加盐(干扰项)                                                            
10 md5.update('公司内部自己定义的盐'.encode('utf8'))                              
11 # 动态加盐(干扰项)  当前时间 用户名的部分 uuid(随机字符串(永远不会重复))                         
12 import time                                                          
13 res1 = str(time.time())                                              
14 md5.update(res1.encode('utf8'))                                      
15 # 真实数据                                                               
16 md5.update(b'hellojason123')                                         
17 # 3.获取加密之后的密文数据(没有规则的一串随机字符串)                                        
18 res = md5.hexdigest()                                                
19 print(res)  # 4326fe1839d7c4186900eb2b356d4f8a

⑥检校文件一致性

 

1 import hashlib                    
2                                   
3 md5 = hashlib.md5()               
4 with open(r'a.txt', 'rb') as f:   
5     for line in f:                
6         md5.update(line)          
7 real_data = md5.hexdigest()       
8 print(real_data)

 

logging日志模块

1 import logging                         
2 # 日志有五个等级(从上往下重要程度不同)                  
3 logging.debug('debug级别') # 10          
4 logging.info('info级别')  # 20           
5 logging.warning('warning') # 30        
6 logging.error('error级别')  # 40         
7 logging.critical('critical级别')  # 50   
8 '''默认记录的级别在30 及以上'''
1 # 简单使用
 2 file_handler = logging.FileHandler(filename='x1.log', made='a', encoding='utf8')
 3 logging.basicConfig(
 4     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
 5     datefmt='%Y-%m-%d %H:%M:%S %p',
 6     handlers=[file_handler, ],
 7     level=logging.ERROR)
 8 logging.error('好好学习,天天向上')
 9 """
10 1.如何控制日志输入的位置
11     想在文件和终端中同时打印
12 2.不同位置如何做到不同的日志格式
13     文件详细一些 终端简单一些
14 """

日志模块详细介绍

1 # 日志有五个等级(从上往下重要程度不同)
 2 logging.debug('debug级别')  # 10
 3 logging.info('info级别')  # 20
 4 logging.warning('warning')  # 30
 5 logging.error('error级别')  # 40
 6 logging.critical('critical级别')  # 50
 7 '''默认记录的级别在30 及以上'''
 8 
 9 # 简单使用
10 file_handler = logging.FileHandler(filename='x1.log', made='a', encoding='utf8')
11 logging.basicConfig(
12     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
13     datefmt='%Y-%m-%d %H:%M:%S %p',
14     handlers=[file_handler, ],
15     level=logging.ERROR)
16 logging.error('好好学习,天天向上')
17 """
18 1.如何控制日志输入的位置
19     想在文件和终端中同时打印
20 2.不同位置如何做到不同的日志格式
21     文件详细一些 终端简单一些
22 """
23 
24 import logging
25 
26 # logging:负责产生日志
27 logger = logging.getLogger('转账记录')
28 # handler对象:负责日志的产生的位置
29 hd1 = logging.FileHandler('xx.log', encoding='utf8')
30 hd2 = logging.FileHandler('xx.log', encoding='utf8')  # 产生的结果到文件
31 hd3 = logging.FileHandler('xx.log', encoding='utf8')
32 # formatter负责日志的格式
33 fm1 = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
34                         datefmt='%Y-%m-%d %H:%M:%S %p', )
35 fm2 = logging.Formatter(fmt='%(asctime)s - %(name)s %(message)s',
36                         datefmt='%Y-%m-%d', )
37 
38 # 5.绑定handler对象
39 logger.addHandler(hd1)
40 logger.addHandler(hd2)
41 logger.addHandler(hd3)
42 # 6.绑定formatter对象
43 hd1.setFormatter(fm1)
44 hd2.setFormatter(fm2)
45 hd3.setFormatter(fm1)
46 # 7.设置日志等级
47 logger.setLevel(30)
48 # 8.记录日志
49 logger.debug('好好学习,天天向上')

配置字典

1 # 核心就在于CV
 2 import logging
 3 import logging.config
 4 
 5 standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
 6                   '[%(levelname)s][%(message)s]'  # 其中name为getlogger指定的名字
 7 
 8 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
 9 
10 logfile_path = 'a3.log'
11 # log配置字典
12 LOGGING_DIC = {
13     'version': 1,
14     'disable_existing_loggers': False,
15     'formatters': {
16         'standard': {
17             'format': standard_format
18         },
19         'simple': {
20             'format': simple_format
21         },
22     },
23     'filters': {},  # 过滤日志
24     'handlers': {
25         # 打印到终端的日志
26         'console': {
27             'level': 'DEBUG',
28             'class': 'logging.StreamHandler',  # 打印到屏幕
29             'formatter': 'simple'
30         },
31         # 打印到文件的日志,收集info及以上的日志
32         'default': {
33             'level': 'DEBUG',
34             'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
35             'formatter': 'standard',
36             'filename': logfile_path,  # 日志文件
37             'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
38             'backupCount': 5,
39             'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
40         },
41     },
42     'loggers': {
43         # logging.getLogger(__name__)拿到的logger配置  空字符串作为键 能够兼容所有的日志
44         '': {
45             'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
46             'level': 'DEBUG',
47             'propagate': True,  # 向上(更高level的logger)传递
48         },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
49     },
50 }
51 
52 # 使用配置字典
53 logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
54 logger1 = logging.getLogger('xxx')
55 logger1.debug('好好学习')

第三方模块

1 # 并不是python自带的 需要基于网络下载!!!
 2 
 3 '''pip所在的路径添加环境变量'''
 4 下载第三方模块的方式
 5     方式1:命令行借助于pip工具
 6         pip3 install 模块名  # 不知道版本默认是最新版
 7         pip3 install 模块名==版本号  # 指定版本下载
 8         pip3 install 模块名 -i 仓库地址  # 临时切换
 9         '''命令行形式永久修改需要修改python解释器源文件'''
10     方式2:pycharm快捷方式
11         settings 
12             project 
13                 project interprter
14                     双击或者加号
15         点击右下方manage管理添加源地址即可
16 # 下载完第三方模块之后 还是使用import或from import句式导入使用
17 """
18 pip命令默认下载的渠道是国外的python官网(有时候会非常的慢)
19 我们可以切换下载的源(仓库)
20       (1)阿里云 http://mirrors.aliyun.com/pypi/simple/
21     (2)豆瓣 http://pypi.douban.com/simple/
22     (3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
23     (4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
24     (5)华中科技大学http://pypi.hustunique.com/
25   
26 pip3 install openpyxl -i http://mirrors.aliyun.com/pypi/simple/
27 """
28 
29 
30 """
31 下载第三方模块可能报错的情况及解决措施
32     1.报错的提示信息中含有关键字timeout
33         原因:网络不稳定
34         措施:再次尝试 或者切换更加稳定的网络
35     2.找不到pip命令
36         环境变量问题
37     3.没有任何的关键字 不同的模块报不同的错
38         原因:模块需要特定的计算机环境
39         措施:拷贝报错信息 打开浏览器 百度搜索即可
40             pip下载某个模块报错错误信息
41 """