天天看點

用 Flask 來寫個輕部落格 (19) — 以 Bcrypt 密文存儲賬戶資訊與實作使用者登陸表單目錄前文清單修改 User ModelFlask Bcrypt将 Bcrypt 應用到 User Model 中建立登陸表單

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#%E5%89%8D%E6%96%87%E5%88%97%E8%A1%A8">前文清單</a>

<a href="#%E4%BF%AE%E6%94%B9-user-model">修改 User Model</a>

<a href="#flask-bcrypt">Flask Bcrypt</a>

<a href="#%E5%B0%86-bcrypt-%E5%BA%94%E7%94%A8%E5%88%B0-user-model-%E4%B8%AD">将 Bcrypt 應用到 User Model 中</a>

<a href="#%E5%88%9B%E5%BB%BA%E7%99%BB%E9%99%86%E8%A1%A8%E5%8D%95">建立登陸表單</a>

<a href="http://blog.csdn.net/jmilk/article/details/53150084">用 Flask 來寫個輕部落格 (1) — 建立項目</a>

<a href="http://blog.csdn.net/jmilk/article/details/53152158">用 Flask 來寫個輕部落格 (2) — Hello World!</a>

<a href="http://blog.csdn.net/jmilk/article/details/53153382">用 Flask 來寫個輕部落格 (3) — (M)VC_連接配接 MySQL 和 SQLAlchemy</a>

<a href="http://blog.csdn.net/jmilk/article/details/53184903">用 Flask 來寫個輕部落格 (4) — (M)VC_建立資料模型和表</a>

<a href="http://blog.csdn.net/jmilk/article/details/53187575">用 Flask 來寫個輕部落格 (5) — (M)VC_SQLAlchemy 的 CRUD 詳解</a>

<a href="http://blog.csdn.net/jmilk/article/details/53229180">用 Flask 來寫個輕部落格 (6) — (M)VC_models 的關系(one to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53239740">用 Flask 來寫個輕部落格 (7) — (M)VC_models 的關系(many to many)</a>

<a href="http://blog.csdn.net/jmilk/article/details/53241361">用 Flask 來寫個輕部落格 (8) — (M)VC_Alembic 管理資料庫結構的更新和降級</a>

<a href="http://blog.csdn.net/jmilk/article/details/53264049">用 Flask 來寫個輕部落格 (9) — M(V)C_Jinja 文法基礎快速概覽</a>

<a href="http://blog.csdn.net/jmilk/article/details/53292248">用 Flask 來寫個輕部落格 (10) — M(V)C_Jinja 常用過濾器與 Flask 特殊變量及方法</a>

<a href="http://blog.csdn.net/jmilk/article/details/53303870">用 Flask 來寫個輕部落格 (11) — M(V)C_建立視圖函數</a>

<a href="http://blog.csdn.net/jmilk/article/details/53306560">用 Flask 來寫個輕部落格 (12) — M(V)C_編寫和繼承 Jinja 模闆</a>

<a href="http://blog.csdn.net/jmilk/article/details/53321939">用 Flask 來寫個輕部落格 (13) — M(V)C_WTForms 服務端表單檢驗</a>

<a href="http://blog.csdn.net/jmilk/article/details/53327164">用 Flask 來寫個輕部落格 (14) — M(V)C_實作項目首頁的模闆</a>

<a href="http://blog.csdn.net/jmilk/article/details/53332204">用 Flask 來寫個輕部落格 (15) — M(V)C_實作博文頁面評論表單</a>

<a href="http://blog.csdn.net/jmilk/article/details/53342517">用 Flask 來寫個輕部落格 (16) — MV(C)_Flask Blueprint 藍圖</a>

<a href="http://blog.csdn.net/jmilk/article/details/53352359">用 Flask 來寫個輕部落格 (17) — MV(C)_應用藍圖來重構項目</a>

<a href="http://blog.csdn.net/jmilk/article/details/53363109">用 Flask 來寫個輕部落格 (18) — 使用工廠模式來生成應用對象</a>

使用明文的方式存儲賬戶資料是一個非常嚴重的安全隐患,要保護使用者的密碼,就要使用 雜湊演算法的單向加密方法。

雜湊演算法:對于相同的資料,雜湊演算法總是會生成相同的結果。

單向加密:就是資訊在加密之後,其原始資訊是不可能通過密文反向計算出來的。

是以,為了賬戶資訊的安全,在資料庫中存儲的密碼應該是被哈希過的哈希值。但是需要注意,雜湊演算法的種類很多,其中大多是是不安全的,可以被黑客 暴力破解。

暴力破解:通過周遊各種資料的哈希值,來找到比對的哈希值,進而擷取你的密碼權限。

是以這裡我們使用 Bcrypt 雜湊演算法,這是一種被刻意設計成抵消且緩慢的哈希計算方式,進而極大的加長了暴力破解的時間和成本,以此來保證安全性。

安裝

NOTE: Flask Bcrypt 與 Flask SQLAlchemy 一樣需要使用 app 對象來進行初始化,我們在 jmilkfansblog 目錄下建立一個 extensions.py 來實作我們以後會使用到的所有 Flask 擴充。

extensions.py

NOTE 1:以後所有會使用到的 Flask 擴充都會在 extensions.py 中。

jmilkfansblog/__init__.py

NOTE 2:子產品中的導入路徑最好使用絕對路徑。

models.py

<code>set_password(self, password)</code>:在設定密碼的時候,将明文密碼轉換成為 Bcrypt 類型的哈希值。

<code>check_password(self, password)</code>:檢驗輸入的密碼的哈希值,與存儲在資料庫中的哈希值是否一緻。

驗證

forms.py

NOTE 1: LoginForm 重載的 validate() 中調用了父類 Form 中的 validate(),用于檢驗使用者輸入的資料是否通過了 username/password 字段的檢驗器。

NOTE 2:LoginForm 重載的 validate() 不僅僅實作了父類的功能,還實作了檢驗 username 是否存在和使用者輸入的 password 是否正确的功能。子類重載父類的方法結合 super() 内置函數是 Python OOP 中常用的技巧。