加密模块hashlib+日志模块logging

1.hashlib 加密模块

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

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

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

1.hashlib模块基本使用

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

# 基本使用
import hashlib md5 = Message Digest v. 理解,领悟;消化 1.先确定算法类型(md5普遍使用)
md5 = hashlib.md5()
2.将明文数据传递给md5算法(update只能接受bytes类型数据)
md5.update('123'.encode('utf8'))
md5.update(b'123')
3.获取加密之后的密文数据(没有规则的一串随机字符串)
res = md5.hexdigest()
print(res)
'''
PS:不能简写,合并到一起会出问题,必须确定算法类型,如果直接‘模块.hexdigest打印的值都是同一个。
'''

1.2 详细操作

①md5加密模式

1.明文数据只要是相同的 那么无论如何传递加密结果肯定是一样的
import hashlib
1.先确定算法类型(md5普遍使用)
md5 = hashlib.md5()
2.将明文数据传递给md5算法(update只能接受bytes类型数据)
md5.update('123'.encode('utf8'))
md5.update(b'hellojason123')
md5.update(b'hello')
md5.update(b'jason')
md5.update(b'123') # 4bd388611b31c548eedef14b16c9868c
3.获取加密之后的密文数据(没有规则的一串随机字符串)
res = md5.hexdigest()ss
print(res) # 4bd388611b31c548eedef14b16c9868c PS: 打印出来的'res'这一行加密的密文包含以上'所有md5.updata'之后的数据

②sha256复杂加密模式

2.密文数据越长表示内部对应的算法越复杂 越难被正向破解
import hashlib
1.先确定算法类型(md5普遍使用)
md5 = hashlib.sha256()
2.将明文数据传递给md5算法(update只能接受bytes类型数据)
md5.update('123'.encode('utf8'))
md5.update(b'hellojason123')
md5.update(b'hello')
md5.update(b'jason')
md5.update(b'123') # 6ec0f865ec4e9bcf9abc7f6c0e7268acfb2ba36f3e460fd592a214f7eacc92b0
3.获取加密之后的密文数据(没有规则的一串随机字符串)
res = md5.hexdigest()
print(res) # 6ec0f865ec4e9bcf9abc7f6c0e7268acfb2ba36f3e460fd592a214f7eacc92b0
"""
密文越长表示算法越复杂 对应的破解算法的难度越高
但是越复杂的算法所需要消耗的资源也就越多 密文越长基于网络发送需要占据的数据也就越大
具体使用什么算法取决于项目的要求 一般情况下md5足够了
"""

tips:涉及到用户密码存储,其实都是密文,只有用户自己知道明文是什么。

1.内部程序员无法得知明文数据

2.数据泄露也无法得知明文数据

ATM购物车练习 用户密码采取的就是密文存取

③加盐操作(普通加盐)

4.加盐处理
"""在对明文数据做加密处理过程前添加一些干扰项"""
import hashlib
1.先确定算法类型(md5普遍使用)
md5 = hashlib.md5()
2.将明文数据传递给md5算法(update只能接受bytes类型数据)
md5.update('123'.encode('utf8'))
加盐(干扰项)
md5.update('公司内部自己定义的盐'.encode('utf8'))
真实数据
md5.update(b'hellojason123')
3.获取加密之后的密文数据(没有规则的一串随机字符串)
res = md5.hexdigest()
print(res) # 4326fe1839d7c4186900eb2b356d4f8a

④加盐操作(动态加盐)

5.动态加盐
"""
在对明文数据做加密处理过程前添加一些变化的干扰项
"""
import hashlib
1.先确定算法类型(md5普遍使用)
md5 = hashlib.md5()
2.将明文数据传递给md5算法(update只能接受bytes类型数据)
md5.update('123'.encode('utf8'))
# 加盐(干扰项)
md5.update('公司内部自己定义的盐'.encode('utf8'))
# 动态加盐(干扰项) 当前时间 用户名的部分 uuid(随机字符串(永远不会重复))
import time
res1 = str(time.time())
md5.update(res1.encode('utf8'))
# 真实数据
md5.update(b'hellojason123')
3.获取加密之后的密文数据(没有规则的一串随机字符串)
res = md5.hexdigest()
print(res) # 4326fe1839d7c4186900eb2b356d4f8a """
在IT互联网领域 没有绝对的安全可言 只有更安全
原因在于互联网的本质 就是通过网线(网卡)连接计算机
"""
#### ⑤检验文件一致性
```python
6.校验文件一致性
"""
文件不是很大的情况下 可以将所有文件内部全部加密处理
但是如果文件特别大 全部加密处理相当的耗时好资源 如何解决???
针对大文件可以使用切片读取的方式
"""
import hashlib
md5 = hashlib.md5()
with open(r'a.txt','rb') as f:
for line in f:
md5.update(line)
real_data = md5.hexdigest()
print(real_data) # 29d8ea41c610ee5d1e76dd0a42c7e60a with open(r'a.txt','rb') as f:
for line in f:
md5.update(line)
error_data = md5.hexdigest()
print(error_data) # 738a56b49f24884ba758d1e4ab6ceb74
import os
# 读取文件总大小
res = os.path.getsize(r'a.txt')
# 指定分片读取策略(读几段 每段几个字节) 10 f.seek()
read_method = [0,res//4,res//2,res] **eg:比特流技术、断点续传技术**

2.logging 日志模块

2.1 日志的5个等级

2.1 日志有5个等级(从上往下重要程度不一样)
logging.debug('debug级别') # 10
logging.info('info级别') # 20
logging.warning('warning级别') # 30
logging.error('error级别') # 40
logging.critical('critical级别') # 50
'''默认记录的级别在30及以上'''

2.2 基本使用

2.2 基本使用
import logging
file_handler = logging.FileHandler(filename='x1.log', mode='a', encoding='utf-8',)
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
handlers=[file_handler,],
level=logging.ERROR
)
logging.error('日志模块很好学 不要自己吓自己')
"""
1.如何控制日志输入的位置
想在文件和终端中同时打印
2.不同位置如何做到不同的日志格式
文件详细一些 终端简单一些
"""

2.3 详细操作

# 1.logger对象:负责产生日志
logger = logging.getLogger('转账记录')
# 2.filter对象:负责过滤日志(直接忽略)
# 3.handler对象:负责日志产生的位置
hd1 = logging.FileHandler('a1.log',encoding='utf8') # 产生到文件的
hd2 = logging.FileHandler('a2.log',encoding='utf8') # 产生到文件的
hd3 = 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(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 6.绑定formatter对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 7.设置日志等级
logger.setLevel(30)
# 8.记录日志
logger.debug('写了半天 好累啊 好热啊')

2.4 配置字典(主要掌握使用即可)

核心技能:C + V

import logging
import logging.config standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' logfile_path = 'a3.log'
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
} **# 使用配置字典
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
logger1 = logging.getLogger('xxx')
logger1.debug('好好的 不要浮躁 努力就有收获')**

★★★使用配置字典的核心三行代码

  logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
logger1 = logging.getLogger('xxx')
logger1.debug('好好的 不要浮躁 努力就有收获')

加密模块hashlib+日志模块logging的更多相关文章

  1. 日志模块logging使用心得

    在应用程序使用中,日志输出对应用维护人员.开发人员判断程序的问题起重要作用. 那么在python中如何定义程序的日志输出? 推荐使用日志模块logging 需求:实现日志内容输出在文件中和控制器中 i ...

  2. python日志模块logging

    python日志模块logging   1. 基础用法 python提供了一个标准的日志接口,就是logging模块.日志级别有DEBUG.INFO.WARNING.ERROR.CRITICAL五种( ...

  3. Python 日志模块 logging通过配置文件方式使用

    vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...

  4. Python(2.7.6) 标准日志模块 - Logging Handler

    Python 标准日志模块使用 Handler 控制日志消息写到不同的目的地,如文件.流.邮件.socket 等.除了StreamHandler. FileHandler 和 NullHandler ...

  5. python 重要的日志模块logging

    一,logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  6. 【python】【logging】python日志模块logging常用功能

    logging模块:应用程序的灵活事件日志系统,可以打印并自定义日志内容 logging.getLogger 创建一个log对象 >>> log1=logging.getLogger ...

  7. Python 日志模块logging

    logging模块: logging是一个日志记录模块,可以记录我们日常的操作. logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开. logging日志等级: ...

  8. Python日志模块logging用法

    1.日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 ...

  9. Python日志模块logging&JSON

    日志模块的用法 json部分 先开一段测试代码:注意  str可以直接处理字典   eval可以直接将字符串转成字典的形式 dic={'key1':'value1','key2':'value2'} ...

随机推荐

  1. koa路由接口

    const router = require('koa-router')() //返回一个页面 router.get('/', async (ctx, next) => { global.con ...

  2. JS 利用新浪接口通过IP地址获取当前所在城市

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">< ...

  3. 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)

    邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...

  4. 基于Bert的恶意软件多分类

    基于Bert从Windows API序列做恶意软件的多分类 目录 基于Bert从Windows API序列做恶意软件的多分类 0x00 数据集 0x01 BERT BERT的模型加载 从文本到ids ...

  5. Java 内幕新闻第二期深度解读

    这是由 Java 官方发布,Oracle JDK 研发 Nipafx 制作的节目,包含 JDK 近期的研发进展和新特性展望和使用,这里加上个人译制的字幕搬运而来.我把 Nipafx 的扩展资料详细研读 ...

  6. Android学习笔记3

    (5)练习做一个实现两个数相乘的APP ①.java代码: //MainActivity.java package com.example.hello; import android.content. ...

  7. 【记录一个问题】redis中执行事务出现错误“EXECABORT Transaction discarded because of previous errors”

    执行事务的大致代码如下: redisClient := GetRedisClient() pipe := redisClient.TxPipeline() err := pipe.ZAdd(k, ar ...

  8. golang中循环或递归求阶乘

    package main import "fmt" func factorialFor(num int) (ret int) { // 循环求阶乘 ret = 1 for i := ...

  9. Tomcat-Tomcat服务器实例使用的其他细节说明

    1,修改工程访问路径 context修改路径 ,访问的地址也会改变成一致 2,修改运行的端口号 3,修改运行时使用的浏览器 4,配置资源热部署

  10. javaObject—toString方法

    1 package face_object; 2 /* 3 * Object:所有类的根类. 4 * Object是不断抽取而来的,具备所有对象都具备的共性内容. 5 * 常用的共性功能: 6 * 7 ...