Python的hashlib提供了常見的摘要算法MD5。python
咱們以常見的摘要算法MD5爲例,計算出一個字符串的MD5值:算法
import hashlib md5=hashlib.md5() md5.update('how to use md5 in python'.encode('utf-8')) print(md5.hexdigest())
若是數據量很大,能夠分塊屢次調用update(),最後計算的結果是同樣的:數據庫
import hashlib md5=hashlib.md5() md5.update('how to use md5'.encode('utf-8')) md5.update(' in python'.encode('utf-8')) print(md5.hexdigest()) >>> cdbbdefc48242586611e311f84e921b0
考慮這麼個狀況,不少用戶喜歡用123456,888888,password這些簡單的口令,因而,黑客能夠事先計算出這些經常使用口令的MD5值,獲得一個反推表:ide
'e10adc3949ba59abbe56e057f20f883e': '123456' '21218cca77804d2ba1922c33e0151105': '888888' '5f4dcc3b5aa765d61d8327deb882cf99': 'password'
這樣,無需破解,只須要對比數據庫的MD5,黑客就得到了使用經常使用口令的用戶帳號.加密
因爲經常使用口令的MD5值很容易被計算出來,因此,要確保存儲的用戶口令不是那些已經被計算出來的經常使用口令的MD5,這一方法經過對原始口令加一個複雜字符串來實現,俗稱「加鹽」:spa
例如一個簡單的用戶登陸實例:debug
import hashlib SALT = b'2erer3asdfwerxdf34sdfsdfs90' def md5(pwd): # 實例化對象 obj = hashlib.md5(SALT) # 寫入要加密的字節 obj.update(pwd.encode('utf-8')) # 獲取密文 return obj.hexdigest() # c5395258d82599e5f1bec3be1e4dea4a user = input("請輸入用戶名:") pwd = input("請輸入密碼:") if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a': print('登陸成功') else: print('登陸失敗')
logging模塊日誌
import logging logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')
默認狀況下Python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG),默認的日誌格式爲日誌級別:Logger名稱:用戶輸出消息。code
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='/tmp/test.log', filemode='w') logging.debug('debug message') logging.info('info message') logging.warning('warning message') logging.error('error message') logging.critical('critical message')