標籤:isp username user 類型 style 32位 localtime remove upd
一.time
1.時間表示形式
在Python中,通常有這三種方式來表示時間:時間戳記、元組(struct_time)、格式化的時間字串:
(1)時間戳記(timestamp) :通常來說,時間戳記表示的是從1970年1月1日00:00:00開始按秒計算的位移量。我們運行“type(time.time())”,返回的是float類型。
(2)格式化的時間字串(Format String): ‘1988-03-16’
(3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)
#<1> 時間戳記>>> import time>>> time.time()1493200540.9646277# <2> 時間字串>>> time.strftime(‘%Y-%m-%d %X‘)‘2017-04-26 17:56:30‘# <3> 時間元組>>> time.localtime()time.struct_time(tm_year=2017, tm_mon=4, tm_mday=26, tm_hour=17, tm_min=56, tm_sec=48, tm_wday=2, tm_yday=116, tm_isdst=0)
小結:時間戳記是電腦能夠識別的時間;時間字串是人能夠看懂的時間;元組則是用來操作時間的
2.幾種時間形式的轉換
(1)
#一 時間戳記<---->結構化時間: localtime/gmtime mktime>>> time.localtime(3600*24)>>> time.gmtime(3600*24)>>> time.mktime(time.localtime())#字串時間<---->結構化時間: strftime/strptime>>> time.strftime("%Y-%m-%d %X", time.localtime())>>> time.strptime("2017-03-16","%Y-%m-%d")
(2)
>>> time.asctime(time.localtime(312343423))‘Sun Nov 25 10:03:43 1979‘>>> time.ctime(312343423)‘Sun Nov 25 10:03:43 1979‘
1 #--------------------------其他方法2 # sleep(secs)3 # 線程延遲指定的時間運行,單位為秒。
二.random模組
>>> import random>>> random.random() #大於0且小於1 之間的小樹0.7032311694364002>>> >>> random.randint(1,5) #1<=且<=5之間的整數3>>> >>> random.randrange(1,3) #大於等於1且小於3之間的整數2>>> >>> random.choice([1,‘23‘,[4,5]]) #1或23或[4,5][4, 5]>>> >>> random.sample([1,‘23‘,[4,5]],2) #列表元素任意2個組合[‘23‘, [4, 5]]>>> >>> >>> random.uniform(1,3) #大於1 小於3的小數1.1161744833134866>>> >>> >>> >>> l = [1,3,5,7,9]>>> >>> random.shuffle(l) #打亂次序>>> l[1, 3, 7, 5, 9]>>> random.shuffle(l) #再次打亂>>> l[9, 7, 3, 1, 5]
#產生驗證碼:
import randomdef v_code(): code = ‘‘ for i in range(5): num=random.randint(0,9) alf=chr(random.randint(65,90)) #asiic碼 add=random.choice([num,alf]) code="".join([code,str(add)]) return codeprint(v_code())
View Code
三.hashlib
1.演算法介紹
python的hashlib提供了常見的摘要演算法,如MD5,SHA1等。。。
摘要演算法又稱 雜湊演算法,散列演算法。它通過一個函數,把任意長度的資料轉為一個長度固定的資料串(通常用16進位的字串)
摘要演算法就是通過摘要函數f()對任意長度的資料data計算出固定長度的摘要digest,目的是為了發現未經處理資料是否被人篡改過。
摘要演算法之所以能指出資料是否被篡改過,就是因為摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對未經處理資料做一個bit的修改,都會導致計算出的摘要完全不同。
我們以常見的摘要演算法MD5為例,計算出一個字串的MD5值:
import hashlibm = hashlib.md5()m.update(‘alex‘.encode(‘utf8‘)) print(m.hexdigest())#輸出結果534b44a19bf18d20b71ecc4eb77c572f
import hashlibm = hashlib.md5()m.update(‘alex‘.encode(‘utf8‘)) #534b44a19bf18d20b71ecc4eb77c572fprint(m.hexdigest())m.update(‘alex‘.encode(‘utf8‘)) #alexalexprint(m.hexdigest())n = hashlib.md5(‘salt‘.encode(‘utf8‘))n.update(b‘alexalex‘)print(n.hexdigest())
例一
如果資料量很大,可以分塊多次調用update(),最後計算的結果是一樣的:
import hashlibm = hashlib.md5()m.update(‘how to use md5 in python hashlib?‘.encode(‘utf8‘))print(m.hexdigest())##結果#d26a53750bc40b38b65a520292f69306m = hashlib.md5()m.update(‘how to use md5 in ‘.encode(‘utf8‘))m.update(‘python hashlib?‘.encode(‘utf8‘))print(m.hexdigest())##結果d26a53750bc40b38b65a520292f69306
View Code
MD5是最常見的摘要演算法,速度很快,產生結果是固定的128 bit位元組,通常用一個32位的16進位字串表示。另一種常見的摘要演算法是SHA1,調用SHA1和調用MD5完全類似:
import hashlib sha1 = hashlib.sha1()sha1.update(‘how to use sha1 in ‘)sha1.update(‘python hashlib?‘)print sha1.hexdigest()
SHA1的結果是160 bit位元組,通常用一個40位的16進位字串表示。比SHA1更安全的演算法是SHA256和SHA512,不過越安全的演算法越慢,而且摘要長度更長。
2.摘要演算法應用
任何允許使用者登入的網站都會儲存使用者登入的使用者名稱和口令。如何儲存使用者名稱和口令呢?方法是存到資料庫表中:
name | password--------+----------michael | 123456bob | abc999alice | alice2008
如果以明文儲存使用者口令,如果資料庫泄露,所有使用者的口令就落入駭客的手裡。此外,網站營運人員是可以訪問資料庫的,也就是能擷取到所有使用者的口令。正確的儲存口令的方式是不儲存使用者的明文口令,而是儲存使用者口令的摘要,比如MD5:
username | password---------+---------------------------------michael | e10adc3949ba59abbe56e057f20f883ebob | 878ef96e86145580c38c87f0410ad153alice | 99b1c2188db85afee403b1536010c2c9
考慮這麼個情況,很多使用者喜歡用123456,888888,password這些簡單的口令,於是,駭客可以事先計算出這些常用口令的MD5值,得到一個反推表:
‘e10adc3949ba59abbe56e057f20f883e‘: ‘123456‘‘21218cca77804d2ba1922c33e0151105‘: ‘888888‘‘5f4dcc3b5aa765d61d8327deb882cf99‘: ‘password‘
這樣,無需破解,只需要對比資料庫的MD5,駭客就獲得了使用常用口令的使用者帳號。
對於使用者來講,當然不要使用過於簡單的口令。但是,我們能否在程式設計上對簡單口令加強保護呢?
由於常用口令的MD5值很容易被計算出來,所以,要確儲存儲的使用者口令不是那些已經被計算出來的常用口令的MD5,這一方法通過對原始口令加一個複雜字串來實現,俗稱“加鹽”:
hashlib.md5("salt".encode("utf8"))
經過Salt處理的MD5口令,只要Salt不被駭客知道,即使使用者輸入簡單口令,也很難通過MD5反推明文口令。
但是如果有兩個使用者都使用了相同的簡單口令比如123456,在資料庫中,將儲存兩條相同的MD5值,這說明這兩個使用者的口令是一樣的。有沒有辦法讓使用相同口令的使用者儲存不同的MD5呢?
如果假定使用者無法修改登入名稱,就可以通過把登入名稱作為Salt的一部分來計算MD5,從而實現相同口令的使用者也儲存不同的MD5。
摘要演算法在很多地方都有廣泛的應用。要注意摘要演算法不是密碼編譯演算法,不能用於加密(因為無法通過摘要反推明文),只能用於防篡改,但是它的單向計算特性決定了可以在不儲存明文口令的情況下驗證使用者口令。
四.os模組
os模組是與作業系統互動的一個介面
‘‘‘os.getcwd() 擷取當前工作目錄,即當前python指令碼工作的目錄路徑os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cdos.curdir 返回目前的目錄: (‘.‘)os.pardir 擷取目前的目錄的父目錄字元串名:(‘..‘)os.makedirs(‘dirname1/dirname2‘) 可產生多層遞迴目錄os.removedirs(‘dirname1‘) 若目錄為空白,則刪除,並遞迴到上一級目錄,如若也為空白,則刪除,依此類推os.mkdir(‘dirname‘) 產生單級目錄;相當於shell中mkdir dirnameos.rmdir(‘dirname‘) 刪除單級空目錄,若目錄不為空白則無法刪除,報錯;相當於shell中rmdir dirnameos.listdir(‘dirname‘) 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印os.remove() 刪除一個檔案os.rename("oldname","newname") 重新命名檔案/目錄os.stat(‘path/filename‘) 擷取檔案/目錄資訊os.sep 輸出作業系統特定的路徑分隔字元,win下為"\\",Linux下為"/"os.linesep 輸出當前平台使用的行終止符,win下為"\t\n",Linux下為"\n"os.pathsep 輸出用於分割檔案路徑的字串 win下為;,Linux下為:os.name 輸出字串指示當前使用平台。win->‘nt‘; Linux->‘posix‘os.system("bash command") 運行shell命令,直接顯示os.environ 擷取系統內容變數os.path.abspath(path) 返回path正常化的絕對路徑os.path.split(path) 將path分割成目錄和檔案名稱二元組返回os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素os.path.basename(path) 返回path最後的檔案名稱。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素os.path.exists(path) 如果path存在,返回True;如果path不存在,返回Falseos.path.isabs(path) 如果path是絕對路徑,返回Trueos.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回Falseos.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回Falseos.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略os.path.getatime(path) 返回path所指向的檔案或者目錄的最後存取時間os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間os.path.getsize(path) 返回path的大小‘‘‘
模組操作:
#----->1import osprint(os.getcwd())f = open(‘test.txt‘,‘w‘)os.chdir(r‘D:\pycharm\catalog\py_fullstack_s4\day32‘) #將路徑33改為 32f = open(‘test2.txt‘,‘w‘)print(os.getcwd())#----->2import osos.makedirs(‘aaaaa/bbb‘)os.removedirs(‘aaaaa/bbb‘)#----->3import osprint(os.listdir(r‘D:\pycharm\catalog\py_fullstack_s4/day33‘))##輸出結果##[‘aaaaa‘, ‘osmy.py‘, ‘test.txt‘, ‘validation.py‘, ‘__init__.py‘, ‘摘要雜湊.py‘, ‘隨機數.py‘]print(os.stat(r‘D:\pycharm\catalog\py_fullstack_s4/day33/test.txt‘))#----->4# ‘pang‘+os.sep+‘di‘print(os.name)print(os.system(‘dir‘))#----->5import osabs = os.path.abspath(‘test.txt‘)print(os.path.basename(abs))print(os.path.dirname(abs))#輸出結果test.txtD:\pycharm\catalog\py_fullstack_s4\day33#----->6import oss1 = r‘D:/pycharm/catalog‘s2 = r‘py_fullstack_s4/day33‘# print(s1+os.sep+s2)ret = os.path.join(s1,s2) #推薦方法print(ret)#輸出結果D:/pycharm/catalog\py_fullstack_s4/day33
View Code
五.sys模組
sys.argv 命令列參數List,第一個元素是程式本身路徑sys.exit(n) 退出程式,正常退出時exit(0)sys.version 擷取Python解釋程式的版本資訊sys.maxint 最大的Int值sys.path 返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值sys.platform 返回作業系統平台名稱
python篇1.13---模組