天天看點

hashlib子產品configparser子產品logging子產品

hashlib子產品

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

什麼是摘要算法呢?摘要算法又稱雜湊演算法、雜湊演算法。它通過一個函數,把任意長度的資料轉換為一個長度固定的資料串(通常用16進制的字元串表示)。

摘要算法就是通過摘要函數f()對任意長度的資料data計算出固定長度的摘要digest,目的是為了發現原始資料是否被人篡改過。

摘要算法之是以能指出資料是否被篡改過,就是因為摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對原始資料做一個bit的修改,都會導緻計算出的摘要完全不同。

我們以常見的摘要算法MD5為例,計算出一個字元串的MD5值:

如果資料量很大,可以分塊多次調用update(),最後計算的結果是一樣的:

MD5是最常見的摘要算法,速度很快,生成結果是固定的128 bit位元組,通常用一個32位的16進制字元串表示。另一種常見的摘要算法是SHA1,調用SHA1和調用MD5完全類似:

SHA1的結果是160 bit位元組,通常用一個40位的16進制字元串表示。比SHA1更安全的算法是SHA256和SHA512,不過越安全的算法越慢,而且摘要長度更長。

任何允許使用者登入的網站都會存儲使用者登入的使用者名和密碼。如何存儲使用者名和密碼呢?方法是存到資料庫表中:

如果以明文儲存使用者密碼,如果資料庫洩露,所有使用者的密碼就落入黑客的手裡。此外,網站運維人員是可以通路資料庫的,也就是能擷取到所有使用者的密碼。正确的儲存密碼的方式是不存儲使用者的明文密碼,而是存儲使用者密碼的摘要,比如MD5:

考慮這麼個情況,很多使用者喜歡用123456,888888,password這些簡單的密碼,于是,黑客可以事先計算出這些常用密碼的MD5值,得到一個反推表:

這樣,無需破解,隻需要對比資料庫的MD5,黑客就獲得了使用常用密碼的使用者賬号。

對于使用者來講,當然不要使用過于簡單的密碼。但是,我們能否在程式設計上對簡單密碼加強保護呢?

由于常用密碼的MD5值很容易被計算出來,是以,要确儲存儲的使用者密碼不是那些已經被計算出來的常用密碼的MD5,這一方法通過對原始密碼加一個複雜字元串來實作,俗稱“加鹽”:

經過Salt處理的MD5密碼,隻要Salt不被黑客知道,即使使用者輸入簡單密碼,也很難通過MD5反推明文密碼。

但是如果有兩個使用者都使用了相同的簡單密碼比如123456,在資料庫中,将存儲兩條相同的MD5值,這說明這兩個使用者的密碼是一樣的。有沒有辦法讓使用相同密碼的使用者存儲不同的MD5呢?

如果假定使用者無法修改登入名,就可以通過把登入名作為Salt的一部分來計算MD5,進而實作相同密碼的使用者也存儲不同的MD5。

摘要算法在很多地方都有廣泛的應用。要注意摘要算法不是加密算法,不能用于加密(因為無法通過摘要反推明文),隻能用于防篡改,但是它的單向計算特性決定了可以在不存儲明文密碼的情況下驗證使用者密碼。

configparser子產品

該子產品适用于配置檔案的格式與windows ini檔案類似,可以包含一個或多個節(section),每個節可以有多個參數(鍵=值)。

來看一個好多軟體的常見文檔格式如下:

如果想用python生成一個這樣的文檔怎麼做呢?

logging子產品

預設情況下Python的logging子產品将日志列印到了标準輸出中,且隻顯示了大于等于WARNING級别的日志,這說明預設的日志級别設定為WARNING(日志級别等級CRITICAL > ERROR > WARNING > INFO > DEBUG),預設的日志格式為日志級别:Logger名稱:使用者輸出消息。

靈活配置日志級别,日志格式,輸出位置:

配置參數:

hashlib子產品configparser子產品logging子產品
hashlib子產品configparser子產品logging子產品

View Code