# Flask實作_ext_07_Flask-Bcrypt_密碼加密
###### tags: `flask` `flask_ext` `python` `Bcrypt`
:::danger
官方文件:
* [Flask-Bcrypt](https://flask-bcrypt.readthedocs.io/en/latest/)
* [Flask-Bcrypt_簡中翻譯](http://flask-bcrypt-docs-zh.readthedocs.io/zh/latest/)
:::
## 說明
在資料庫中保存任何的密碼都不該是明碼,否則當資料庫被駭客攻陷之後造成的個資損失是難以計算的,尤其現行各國法令對個資的保護已愈來愈嚴謹,不得不防。
如果你看一下`flask-bcrypt`的原始碼會發現它的底層是`werkzeug`跟`bcrypt`,有翻過`Flask-Web開發`的人就會想起來,`Miguel Grinberg`在說明加密的時候就是直接利用`werkzeug`來實作的。

不過密碼學非個人所專,所以就只能直接看應用了。
## 安裝
```python=
pip install flask-bcrypt
```
## 範例
利用實作過程中產生的`manager.py`來測試,如下:
```python
from app_blog import app
from flask_script import Manager, Command, prompt_bool, Shell
manager = Manager(app)
@manager.shell
def _make_context():
return dict(app=app, db=db)
manager.add_command("shell", Shell(make_context=_make_context))
if __name__ == "__main__":
manager.run()
```
接著,在Command中執行命令,如下:
```shell=
(venv) D:\proPycharm\app_blog>python manager.py shell
>>> from flask_bcrypt import Bcrypt
>>> bcrypt=Bcrypt(app)
```
第1行:執行`shell`指令,單純為了得到`app`,其實你也可以自己弄一個簡單專案去按標準流程掛就可以了。
第3行:初始化`flask-bcrypt`
利用`dir`來查詢`bcrypt`的method清單,如下:
```shell=
>>> dir(bcrypt)
[...上略...'check_password_hash', 'generate_password_hash', 'init_app']
```
透過`dir`指令可以發現在實作`Bcrypt`之後,包含了三個method,`init_app`用於工廠模式調用供其初始化,其它兩個就是加密(`generate_password_hash`)、驗證(`check_password_hash`),命名非常直觀。
### 加密
```python=
>>> p_hash = bcrypt.generate_password_hash('haha').decode('utf-8')
>>> p_hash
'$2b$12$uawDwD/ynN/Nmo2jseEHcuBpHQWwze/0t40etu/EHJK9uxkr7Tewm'
```
### 驗證
```python=
>>> bcrypt.check_password_hash(p_hash, 'haha')
True
```
## 總結
利用`flask-bcrypt`來針對密碼做加密與驗證非常直觀與便利,唯一注意的是,
官方文件提到,在python3中使用`generate_password_hash`的時候要加上`decode('utf-8')`,接下來就可以試著將這個功能加入我們的實作專案了。