日志模块详细介绍 hashlib模块 动态加盐

一:hashlib模块

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


能够做文件一系列校验
python的hashlib提供了常见的摘要算法, 如MDS,SHA1等等。

什么是摘要算法呢?
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)


加密模块的应用
加密为了保证数据的安全
本质就是将明文变成密文
加密算法 常用: md系列 sha系列 basa系列 hmac系列

hashlib模块
import hashlib
 1.先确定算法类型(md5普遍使用)
md5 = hashlib.md5()
 2.将明文数据传递给md5算法(update只能接受bytes类型数据)
 需要编码
 只有英文数字或:(b'hello 123')
md5.update('123'.encode('utf8'))
 3.获取加密之后的密文数据
res = md5.hexdigest()
print(res)
加密后数据:202cb962ac59075b964b07152d234b70


明文数据只要是相同的 那么无论如何传递加密结果肯定是一样的
 1.加密之后的密文数据是没有办法反解密成明文数据的
 解密只能pc:你只能把这一串随机字符串内部的算法,只能从头往后推,不能从后往推

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

image

1.hasglib模块 sha256类型

hashlib模块
import hashlib
1.先确定算法类型(sha256)
md5 = hashlib.sha256()
 2.将明文数据传递给md5算法(update只能接受bytes类型数据)
 需要编码
 只有英文数字或:(b'hello 123')
md5.update('123'.encode('utf8'))
 3.获取加密之后的密文数据
res = md5.hexdigest()
print(res)
加密算法越长代表越复杂 越难破解
密文数据越长表示内部对应的算法越复杂
加密后数据:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
    
    '''
密文越长表示算法越复杂 对应的破解算法的难度越高
但是越复杂的算法所需要消耗的资源也就越多 密文越长基于网络发送需要占据的数据也就越大
    具体使用什么算法取决于项目的要求 一般情况下md5足够了
'''

image

2.hashlib模块 加盐处理

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

1.内部程序员无法得知明文数据
2.数据泄露也无法得知明文数据


加盐处理
hashlib模块
import hashlib
1.先确定算法类型(md5)
md5 = hashlib.md5()
2.将明文数据传递给md5算法(update只能接受bytes类型数据)
需要编码
只有英文数字或:(b'hello 123')
加盐 (干扰项)
md5.update('公司内部自己定义的盐'.encode('utf8'))
用户真实数据添加
md5.update('123'.encode('utf8'))
3.获取加密之后的密文数据
res = md5.hexdigest()
print(res)

'''
在对明文数据做加密处理过程前添加一些干扰项
这个结果对应的明文,不单单含有密码了,还有干扰项,就算别人把密码猜到了,它也不知道真实的密码是什么
'''

3.hashlib模块 动态 加盐

动态加盐
hashlib模块
import hashlib
1.先确定算法类型(md5)
md5 = hashlib.md5()
2.将明文数据传递给md5算法(update只能接受bytes类型数据)
需要编码
只有英文数字或:(b'hello 123')
动态加盐 (干扰项)   当前时间  用户名的部分  uuid(随机字符串(永远不会重复))
导入内置模块
import time
字符串转换时间 时间动态相当是一个盐 随着时间的流动得出
res = str(time.time())
md5.update(res.encode('utf8'))
用户真实数据添加
md5.update(b'123jason')
3.获取加密之后的密文数据
res = md5.hexdigest()
print(res)

'''
在对明文数据做加密处理过程前添加一些变化的干扰项
'''

image

4.效验文件是否一致 (电脑下载 黑客篡改攻略)

"""
在IT互联网领域 没有绝对的安全可言 只有更安全
    原因在于互联网的本质 就是通过网线(网卡)连接计算机
"""

效验文件是否一致
文件对应着密文  当我电脑下载文件得时候 文件会一并把密文一起给我
然后电脑在底层会自动把刚刚下载得文件 文件会告诉我用什么算法算得,
电脑会把这个文件内容在基于文件之前得算法在添加得出一个密文
用电脑自己算出来得密文跟文件的密文做对比 是否一致
如果是一致 没风险    如果不一致说明被文件内容被篡改 这时计算机会提示

'''
文件不是很大的情况下 可以将所有文件内部全部加密处理
但是如果文件特别大 全部加密处理相当的耗时耗资源'''
针对大文件可以使用切片读取的方式  我只读某一些字符部分

import os
读取文件总大小
res = os.path.getsize(r'sss.txt')
指定分片读取策略 (读几段 每段几个字符)
指定分片读取策略(读几段 每段几个字节)  10   f.seek()
read_method = [0, res//4, res//2, res]

import hashlib
先确定算法类型(md5普遍使用)
md5 = hashlib.md5()

读取 加密
rb支持所有类型 二进制类型
with open(r'sss.txt', 'rb') as f:
    for line in f:
        md5.update(line)
# 得到真实的密文数据
real_data = md5.hexdigest()
print(real_data)
结果:03dfc195680b71bdb0c4aacfbb1757f0


黑客修改数据后
with open(r'sss.txt', 'rb') as f:
    for line in f:
        md5.update(line)
得到真实的密文数据
error_data = md5.hexdigest()
print(error_data)
结果:4fb9e8e7fa939672f55bc8146457fbac



摘要算法其实是很常见的
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

二:logging

知识点很多 但是需要掌握的很少(会用即可)
impotr logging


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

 简单使用
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.不同位置如何做到不同的日志格式
    文件详细一些 终端简单一些
"""

image

1.日志模块详细介绍

import logging


 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('写了半天 好累啊 好热啊')

image

2.配置字典

 核心就在于CV
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('好好的 不要浮躁 努力就有收获')

image

posted @ 2021-11-29 20:06  AlexEvans  阅读(125)  评论(0编辑  收藏  举报