hashlib&logging模組
阿新 • • 發佈:2021-11-29
1. hashlib模組
加密模組
所謂加密就是將明文資料通過一系列演算法變成密文資料(其目的就是為了資料安全)
加密演算法有:md系列,sha系列
還有單獨成體系的:base系列,hmac系列
1.1 基本使用
import hashlib """基本使用""" # 1. 先確定演算法型別(md5常用) md5 = hashlib.md5() # 2. 將明文資料傳遞給md5演算法(update只能接收bytes型別資料) md5.update('明文資料'.encode('utf8')) md5.update(b'hello123') # 3. 獲取加密之後的密文資料(沒有規則的一串隨機字串) res = md5.hexdigest() print(res) """ 機密之後的密文資料是沒有辦法反解密成明文資料的。 至於市面上所謂的破解,就是提前算出一系列明文對應的密文, 之後再對比密文獲取明文。 """
1.2 詳細操作
import hashlib # 1. 明文資料只要是相同的,那麼無論如何傳遞,加密的結果肯定是一樣。 # md5.update(b'hello123') md5.update(b'hello') md5.update(b'123') res = md5.hexdigest() print(res) # 2. 密文資料越長表示內部對應的演算法越複雜,越難被正向破解。 """ 密文越長表示演算法越複雜,對應的破解演算法的難度越高。 但是越複雜的演算法所需要消耗的資源也就越多, 密文越長基於網路傳送需要佔據的資料也就越大 具體使用什麼演算法,取決於專案的要求,一般情況下md5足夠了。 """ # 3. 設計到使用者密碼儲存,其實都是密文,只有使用者自己知道明文是什麼 """ ATM購物車練習,使用者密碼採取的就是密文存取! 優點: 1. 內部程式設計師無法得知明文資料 2. 資料洩露也無法得知明文資料 """ # 4. 加鹽處理!!! # 在對明文資料做加密處理過程中新增一些干擾項 import hashlib md5 = hashlib.md5() # 加鹽(干擾項) md5.update(b'this is salt!!') # 真實密碼資料 md5.update(b'joshua123') res = md5.hexdigest() print(res) # 5. 動態加鹽 import hashlib import time """新增一些變化的干擾項""" md5 = hashlib.md5() # 動態加鹽干擾:當前實際,使用者名稱的部分,uuid(隨機字串,永遠不會重複) ret = str(time.time()) md5.update(ret.encode('utf8')) # 真實密碼資料 md5.update(b'joshua123') res = md5.hexdigest() print(res) """ 在IT網際網路領域,沒有絕對的安全可言,只有更安全 原因在於網際網路的本質,就是通過網線(網絡卡)連線計算機。 """ # 6. 校驗檔案一致性 """ 如果檔案不是很大的情況下,可以將所有檔案內容全部加密處理, 但是如果檔案特別大,全部加密處理耗時耗資源,如何解決??? 針對大檔案,可以使用切片讀取的方式 隨機抽取檔案的幾個部分來讀一下 """ # 實現 import os # 讀取檔案的總大小 total_size = os.getsize(r'a.txt') # 制定分片讀取策略(讀幾段,每段幾個位元組...) # f.seek() read_method = [0, total_size//4, total_size//2, total_size]
位元流技術,,,斷點續傳。。。
2. logging日誌模組
知識點很多,需要掌握的很少,需要會用即可.
import logging # 日誌有五個等級(安全級別) logging.debug() # 啥都記 # 10 logging.info() # 正常程式執行的記錄 # 20 logging.warning('warning級別') # 警告預警 # 30 logging.error('error級別') # 出錯了 # 40 logging.critical('critical級別') # 危及 # 50 # 起碼記錄30及以上,是有必要的。 """預設記錄的級別在30及以上""" # 簡單使用 copy過來 1. 如何控制日誌輸出的位置 想在檔案和終端中同時列印 2. 不同位置如何左到不同的日誌格式 檔案詳細一些,終端簡單一些
日誌模組的四大物件:
# 1. logger物件:負責生產日誌
# 2. filter物件:負責過濾日誌(直接忽略)
# 3. handler物件:負責日誌產生的位置
# 4. formatter物件:負責日誌的格式
配置字典!!!!!!
# 核心就在於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('好好的 不要浮躁 努力就有收穫')