import hashlib#摘要算法的模塊# Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。## 什麼是摘要算法呢?摘要算法又稱哈希算法、散列算法。它經過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(一般用16進制的字符串表示)。## 摘要算法就是經過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是爲了發現原始數據是否被人篡改過。## 摘要算法之因此能指出數據是否被篡改過,就是由於摘要函數是一個單向函數,計算f(data)很容易,但經過digest反推data卻很是困難。並且,對原始數據作一個bit的修改,都會致使計算出的摘要徹底不一樣。# 咱們以常見的摘要算法MD5爲例,計算出一個字符串的MD5值:# md5_obj = hashlib.md5() #選擇摘要算法中的md5類進行實例化,獲得獲得md5_obj# md5_obj.update(b'12345')#對一個字符串進行摘要# md5_obj.update(b'xiaoxiao')#對一個字符串進行摘要# print(md5_obj.hexdigest())#找摘要算法要結果## md5_obj = hashlib.md5()# md5_obj.update(b'12345xiaoxiao')# print(md5_obj.hexdigest())# MD5是最多見的摘要算法,速度很快,生成結果是固定的128 bit字節,# 一般用一個32位的16進制字符串表示。另外一種常見的摘要算法是SHA1,# 調用SHA1和調用MD5徹底相似# md5_obj = hashlib.md5()#選擇摘要算法中的md5類進行實例化,獲得md5_obj# md5_obj.update(b'how to use md5 in python hashlib?alex')#對一個字符串進行摘要# print(md5_obj.hexdigest()) #找摘要算法要結果#一篇文章的校驗#讀文件 : 一行一行拿#轉換成bytes#文件1#文件2#分別打開兩個文件,一行一行讀,沒一行update一下 對比最終的hexdigest# 查看某兩個文件是否徹底一致 —— 文件的一致性校驗# 加密認證 —— 在存儲密碼的時候是使用密文存儲的,校驗密碼的時候對用戶的輸入再作一次校驗# 加鹽# 動態加鹽# import hashlib# sha256_obj = hashlib.sha256('*!金老闆'.encode('utf_8'))# sha256_obj.update(b'12344')# print(sha256_obj.hexdigest())#用戶名 + 一個複雜的字符串 + 密碼#hashilib 摘要算法的模塊# md5 sha1 sha256 sha512# 摘要的過程 不可逆# 能作的事兒: #文件的一致性檢測 #用戶的加密認證 #單純的mg5不夠安全 #加鹽處理 簡單的鹽可能被破解 且破解以後全部的鹽都失效了 #動態加鹽# 默認狀況下Python的logging模塊將日誌打印到了標準輸出中,# 且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING# (日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG)# ,默認的日誌格式爲日誌級別:Logger名稱:用戶輸出消息。# log 日誌# 5000# 帳單 —— 日誌# 計算器中間結果 —— 日誌# 搜索、加入購物車、購買了的東西 —— 日誌# 股票市場的用戶行爲 —— 日誌# 日誌 就是在程序的運行過程當中,人爲的添加一些要打印的中間信息# 在程序的排錯、在一些行爲、結果的記錄# import logging# logging.debug('debug message') #調試模式# logging.info('info message')#信息模式# logging.warning('warning message')#警告模式:不會直接程序的崩潰,可能會出現問題# logging.error('error message')#錯誤模式:出錯了## logging.critical('critical message')#批判模式 程序崩潰了的時候# logging 簡單的配置模式## logging.basicConfig(level=logging.DEBUG,# format='[%(asctime)s]%(filename)s[line:%(lineno)d] %(levelname)s %(message)s',# datefmt='%Y-%m-%d %H:%M:%S',# filename='test.log',# filemode='a')# logging.debug('debug message')# logging.info('info message')# logging.warning('warning message')# logging.error('error message')# logging.critical('critical message')# try:# r = input('num : ')# int(r)# except:# logging.error('please input a num!')# logger = logging.getLogger() #實例化一個logger對象# # 建立一個handler,用於寫入日誌文件# fh = logging.FileHandler('test.log',encoding='utf-8') # 文件句柄-日誌文件操做符# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #日誌輸出格式# formatter2 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #日誌輸出格式# fh.setFormatter(formatter) #文件句柄 綁 格式# logger.setLevel(logging.DEBUG) #設置日誌等級,默認是Warning# logger.addHandler(fh) #logger 綁文件句柄# sh = logging.StreamHandler() #屏幕流對象# sh.setFormatter(formatter2)# logger.addHandler(sh)# logger.info('hello!')# logger = logging.getLogger()# fh = logging.FileHandler('test.log.20171123',encoding='utf-8')# logger.addHandler(fh)#對象的模式 #能夠隨意控制往那些地方輸出日誌 #能夠分別控制輸出到不一樣位置的格式# import logging# logger = logging.getLogger() #實例化一個logger對象# fh = logging.FileHandler('test.log',encoding='utf-8') # 文件句柄-日誌文件操做符# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #日誌輸出格式# fh.setFormatter(formatter) #文件句柄 綁 格式# logger.setLevel(logging.DEBUG) #設置日誌等級,默認是Warning# logger.addHandler(fh) #logger對象綁文件句柄# logger.info('hello!')#向屏幕輸出# logger.setLevel(logging.DEBUG) #設置日誌等級# formatter2 = logging.Formatter('%(asctime)s - %(name)s [%(levelname)s] %(message)s') #日誌輸出格式# sh = logging.StreamHandler() #屏幕流對象 相對於文件句柄# sh.setFormatter(formatter2) # 綁定格式到日誌文件操做符# logger.addHandler(sh) # 綁定屏幕流對象到logging對象# logging.info("我是你爸爸")# 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用戶輸出的消息# 首先讓用戶輸入帳號密碼#對密碼加密 寫到文件裏 完成用戶註冊#再次讓用戶輸入帳號密碼, 密碼和文件中的密碼進行匹配 匹配成功則登陸成功import hashlib# name = input('請輸入用戶名:')# pwd = input('請輸入密碼:')# md5_obj = hashlib.md5()# md5_obj.update(pwd.encode('utf-8'))# # print(md5_obj.hexdigest())# f = open('haha','a',encoding='utf-8')# f.write(name+' '+md5_obj.hexdigest()+'\n')# f.close()count = 3while count>0 : s = 2 name = input('請輸入用戶名:').strip() pwd = input('請輸入密碼:').strip() md5_obj = hashlib.md5() md5_obj.update(pwd.encode('utf-8')) ret = md5_obj.hexdigest() f = open('haha', 'r', encoding='utf-8') for i in f: # print('sgjhg') i = i.strip() i = i.split(' ') if ret == i[1] and name == i[0]: print('登錄成功') s = 1 break if s == 2: print('輸入錯誤') count= count-1 if s == 1: break