1. 程式人生 > 其它 >python內建模組3

python內建模組3

一、hashlib模組

    hashlib加密的基本使用方法

import hashlib
# 第一步 確定一個加密的方法 md5使最常用的加密方法
res = hashlib.md5()
# 第二步 將要加密的內容使用update新增進去 update只能接收bytes型別,如果要加密中文需要編碼
res.update(b'123')  # res.updatae('123'.encode('utf8'))
# 第三步 將內容加密
res1 = res.hexdigest()
print(res1)  # 202cb962ac59075b964b07152d234b70 內容加

    

    詳細操作

    1.明文資料只要是想同的,加密操作分幾步得到的結果都是相同的

    2.密文資料越長,代表越難被破解,演算法就越複雜,需要佔用的資源也就越多

    3.加鹽處理

      得到使用者輸入的資料後,可以將該資料增加一些其他的干擾項,之後再轉為密文資料,增強密碼的安全性

  

    4.動態加鹽

      動態加鹽就是在加鹽的基礎上,將干擾項變為動態的,例如是當前時間,使用者名稱的一部分或者uuid(隨機的字串,永遠不會重複),使密碼的安全性更加可靠。

import time
import hashlib
time = str(time.time())
res = hashlib.md5()
res.update(b'123')
# 增加當前時間干擾項
res.update(time.encode('utf8'))
print(res.hexdigest()) # e2e0a47d1d02405991fb58e1cfebef1a

    5. 驗證檔案的一致性

       有時候我們在下載檔案的時候,會碰到下載的檔案有風險,是因為電腦會自動將下載的檔案內容加密後與原來的檔案比對,如果檔案內容被修改了就會提示風險,該檔案就可能攜帶了病毒

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)  # 46c01494f4d3920a6cc530cf30b91a1e

# 被修改後內容的加密資料
md5 = hashlib.md5()
with open(r'a.txt', 'rb') as f:
    for line in f:
        md5.update(line)
        error_data = md5.hexdigest()
    print(error_data)  # 7a5ed07c5bab39ac557e56d2ca9fd5c2

        可以看到兩次得到的加密資料不一樣,所以電腦會提示我們該檔案下載會有風險

        當一個檔案過大時,我們針對資料加密不會把全部的資料加密,會從檔案裡抽取一部分資料進行加密比對

import hashlib
import os

# 先獲取檔案的大小
res = os.path.getsize('a.txt')
# 根據自己的意願抽取相對應的資料
sample_list = [0, res // 4, res // 2, res]
md5 = hashlib.md5()

with open(r'a.txt', 'rb') as f:
    for line in sample_list:
        f.seek(line)  # 將游標移動到指定的地方
        md5.update(f.read(10))  # 抽取相對應的資料內容
        data = md5.hexdigest()  # 將內容加密
    print(data)

          

二、logging日誌模組

    日誌模組流程介紹

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

  配置字典

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