最近由於工作需要,需要將機密參數存在資料庫當中,並以可逆的加密法做加密,在 Google 之後也發現文章都屬於比較舊,且使用 PyCryptodome 套件,並不支援站長所使用的 Python3.5+ 版本,於是東爬西爬,找到可以取代 PyCryptodome 的 cryptography 套件,本文就簡易說明 cryptography 的簡單用法。
前言
作為登入參數,基本上都是先行將具機密性的明文(如密碼)透過不可逆的雜湊函數(Hash Functin),來取得一列獨一無二的字串,在其將使用者輸入的明文經過雜湊之後在與資料庫做比對判斷是否輸入正確,但此我們需要將密文還原成原本的明文,在此就必須採用可逆的加密方式,並將密文存在資料庫中,當程式抓取資料庫上的密文,在透過本地端的金鑰進行解密。
cryptography 套件
cryptography套件的功能非常強,提供了對稱/非對稱式加密 API,使用方式也非常簡易,僅僅幾行代碼就可以完成加解密的操作,對於有加解密需求的人來說真的是相當的方便。
安裝指令如下,如果但腦上只有 Python3.5+ 單一版本可以使用以下指令。
pip install cryptography
如果是使用 Linux 系統可能要注意有預裝 Python2.7,所以針對 Python3.5+版本使用以下指令。
pip3 install cryptography
官方的範例用法如下,首先載入套件 from cryptography.fernet import Fernet
cryptography.fernet import Fernet key = Fernet.generate_key() key <span class="comment"># 用 Fernet 產生的 URL-safe base64-encoded 金鑰 # b'xO_tztkyYP4-7pFZ2fikoItgH8_2r-TzXSsxyq3GM74=' f = Fernet(key) token = f.encrypt(b"I'm MksYi") token # b'gAAAAABaMjADdzzyukCpoHfrY2sB0J18Wo4wgbQZ4oq8J4M79Rwvz01Y30QnFDeNwY6X_VlxlW2XLsmRrnU77V5hc_HemlOC9Q==' f.decrypt(token) # b"I'm MksYi"
透過以上簡單的範例就可以進行加密,我們只要將密文(此為token)存放到資料庫,並且在需要的時候從資料庫抓取密文,在以我們的金鑰(Key)進行解密就可以得到明文,但是這部分有資料形態的問題需要處理。
Bytes to String
站長所使用的是 MySQL 並沒有所謂 Bytes 資料型態可以存放我們的密文,所以先以手動方式將值以 String 的方式存到資料庫後,剩下的就是提取資料,但 Fernet 無法直接對 String 型態做解密,也就是在解密之前必須先將資料型態轉回 Bytes,在此提供簡單的方式說明如何型態互轉。
b = b"test bytes string" s = "test string" toBytes = bytes(s, encoding = 'utf8') toString = str(b, encoding = 'utf8') toBytes = str.encode(b) toString = bytes.decode(s)
參考資料
cryptography:
https://cryptography.io/en/latest/
https://xin053.github.io/2016/12/20/cryptography加密库使用详解/
型態轉換
http://blog.csdn.net/yatere/article/details/6606316