1. 程式人生 > 其它 >hashlib&logging模組

hashlib&logging模組

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