經常使用模塊Part(2)

logging模塊html

hashlib模塊算法

 

hashlib模塊服務器


Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。app

# 什麼是摘要算法呢?摘要算法又稱哈希算法、散列算法。它經過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(一般用16進制的字符串表示)。
# 摘要算法就是經過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是爲了發現原始數據是否被人篡改過。
# 摘要算法之因此能指出數據是否被篡改過,就是由於摘要函數是一個單向函數,計算f(data)很容易,但經過digest反推data卻很是困難。
# 並且,對原始數據作一個bit的修改,都會致使計算出的摘要徹底不一樣。

# 無論算法多麼不一樣,摘要的功能始終不變
# 對於相同的字符串使用同一個算法進行摘要,獲得的值老是不變的
# 使用不一樣算法對相同的字符串進行摘要,獲得的值應該不一樣
# 無論使用什麼算法,hashlib的使用方式永遠不變
什麼是摘要算法
# 摘要算法
# 密碼的密文存儲
# 文件的一致性驗證
    # 在下載的時候 檢查咱們下載的文件和遠程服務器上的文件是否一致
    # 兩臺機器上的兩個文件 你想檢查這兩個文件是否相等


#目前使用最廣的仍是 MD5
import hashlib
# usr = input('username: ')
# pwd = input('password: ')
# role = input('identity: ')
# with open('userinfo','a+',encoding='utf-8') as f:
#     if usr not in f.read():
#         md5 = hashlib.md5()
#         md5.update(bytes(pwd,encoding='utf-8'))
#         md5_pwd = md5.hexdigest()
#         f.write(usr+'|'+md5_pwd+'|'+role)
#     else:
#         print('用戶名已經存在')

# usr = input('username: ')
# pwd = input('password: ')
# with open('userinfo') as f2:
#     for line in f2:
#         username,passwd,role = line.split('|')
#         md5 = hashlib.md5()
#         md5.update(bytes(pwd,encoding='utf-8'))
#         md5_pwd = md5.hexdigest()
#         if usr == username and md5_pwd == passwd:
#             print('登錄成功')
#         else:
#             print('wrong info')

# 加鹽   防止撞庫破解 md5  ,不過鹽也要複雜點,否則也會被撞庫
import hashlib   # 提供摘要算法的模塊
# md5 = hashlib.md5(bytes('鹽',encoding='utf-8'))
# # md5 = hashlib.md5()
# md5.update(b'123456')
# print(md5.hexdigest())

# 動態加鹽
# 用戶名 密碼
# 使用用戶名的一部分或者 直接使用整個用戶名做爲鹽
# import hashlib   # 提供摘要算法的模塊
# md5 = hashlib.md5(bytes('鹽',encoding='utf-8')+b'')
# # md5 = hashlib.md5()
# md5.update(b'123456')
# print(md5.hexdigest())

# md5 = hashlib.md5(bytes('看你怎麼撞庫',encoding='utf-8'))
md5 = hashlib.md5()
md5.update(b'123321')   #當若是沒有update這個操做,得出的md5也有值,意思是 空密碼
print(md5.hexdigest())


#對於文件的驗證一致性,是不用加鹽的
#摘要算法的update能夠屢次使用,結果不影響輸出md5的值

# md5 = hashlib.md5()
# md5.update(b'123')  #兩處update等價於  md5.update(b'123321')
# print(md5.hexdigest())
# md5.update(b'321')
# print(md5.hexdigest())

with open('somewhere','r',encoding='utf-8') as f:
    md5 = hashlib.md5()
    for line in f:
        md5.update(bytes(line,encoding='utf-8'))
        # md5.hexdigest()
    print(md5.hexdigest())
#
with open('somewhere','r',encoding='utf-8') as f:
    f.seek(4)
    print(f.read())
    md5 = hashlib.md5()
    md5.update(bytes(f.read(),encoding='utf-8'))
    print(md5.hexdigest())
    print(type(md5.hexdigest()))
#
# for i in range(5):
#     print('1')
# print(i)
# with open('somewhere','rb') as f2:
# 用r模式和用rb模式,md5校驗碼不一樣
#     md5 = hashlib.md5()
#     for line in f2:
#         md5.update(line)
#
#     print(md5.hexdigest())
hashlib模塊初識

 

logging模塊ide


日誌是一種能夠追蹤某些軟件運行時所發生事件的方法。函數

默認狀況下Python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG),默認的日誌格式爲日誌級別:Logger名稱:用戶輸出消息。spa

import logging

#create logger
logger = logging.getLogger('log_type')
logger.setLevel(logging.INFO)


# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# create file handler and set level to warning

fh = logging.FileHandler('log_file')
fh.setLevel(logging.INFO)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to ch and fh
ch.setFormatter(formatter)
fh.setFormatter(formatter)

# add ch and fh to logger
logger.addHandler(ch)
logger.addHandler(fh)

#日誌等級按以下順序
# 'application' code
# logger.debug('debug message') #記錄一條日誌,等級爲debug
# logger.info('info message')
# logger.warn('warn message')
# logger.error('error message')
# logger.critical('critical message')
getLogger啓用日誌
logging.basicConfig()函數中可經過具體參數來更改logging模塊默認行爲,可用參數有:

filename:用指定的文件名建立FiledHandler,這樣日誌會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值爲「a」還可指定爲「w」。
format:指定handler使用的日誌顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger(後邊會講解具體概念)的日誌級別
stream:用指定的stream建立StreamHandler。能夠指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認爲sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。

format參數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的日誌級別
%(levelname)s 文本形式的日誌級別
%(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日誌輸出函數的模塊的文件名
%(module)s 調用日誌輸出函數的模塊名
%(funcName)s 調用日誌輸出函數的函數名
%(lineno)d 調用日誌輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌信息時的,自Logger建立以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 「2003-07-08 16:49:45,896」。逗號後面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s用戶輸出的消息
logging一些配置參數

具體能夠看: 詳細的日誌模塊線程

相關文章
相關標籤/搜索