密碼學是將明文轉換為密文的過程或技術,以保護信息在從一台計算機傳輸到另一台計算機期間免受黑客攻擊。 Python 加密模塊允許使用 fernet 模塊將明文或消息(以字節為單位)轉換為密文。 fernet 模塊由內置方法 encrypt()、decrypt() 和 generate_key() 組成,用於加密、解密和生成加密 key 。使用 fernet 加密的文本消息在沒有 key 的情況下無法被操縱或讀取。 MultiFernet 類實現 Fernet 的 key 輪換。 MultiFernet 有一個內置方法 rotate(),可進一步用於廢棄已暴露的舊 key 。
使用方法:
generate_key():此方法生成新的 fernet key 。 key 必須保持安全,因為它是解密密文的最重要組成部分。如果 key 丟失,則用戶將無法再解密該消息。此外,如果入侵者或黑客獲得 key ,他們不僅可以讀取數據,還可以偽造數據。
encrypt(data):它對作為參數傳遞給方法的數據進行加密。這種加密的結果被稱為“Fernet token”,它本質上是密文。加密令牌還包含以明文形式生成時的當前時間戳。如果數據不是以字節為單位,則 encrypt 方法會引發異常。
用法:encrypt(data)
範圍:
- 數據(字節)-待加密的明文。
返回:沒有 key 就無法讀取或更改的密文。它采用 URL-safe base64 編碼,稱為 Fernet 令牌。
crypto(token, ttl = None):此方法解密作為參數傳遞給該方法的 Fernet 令牌。解密成功則得到原始明文結果,否則拋出異常。
用法:decrypt(token, ttl = None)
參數:
- token (字節)-Fernet 令牌(密文)被傳遞以進行解密。
- ttl(int) - 或者,可以提供一個整數作為解密方法中的第二個參數。 ttl 表示令牌的有效時間。如果令牌早於 ttl 秒(從最初創建的時間算起),則會引發異常。如果 ttl 未作為參數傳遞,則不考慮令牌的年齡。如果令牌因某種原因無效,則會引發異常。
返回:返回原始明文。
rotate(token):此方法通過使用 MultiFernet 實例的主 key 重新加密來輪換令牌。但是,重新加密會保留最初與令牌一起保存的時間戳。
用法:rotate(token)
範圍:
- 代幣(字節):要旋轉以重新加密的令牌
返回:如果令牌已成功輪換,則返回輪換後的令牌。如果旋轉失敗,則會拋出異常。
安裝加密包:
pip install cryptography
第一種方法
MultiFernet 使用提供的列表中的第一個 key 執行加密。 MultiFernet 依次使用每個 key 解密令牌。如果在提供的列表中找不到正確的 key ,則會拋出 cryptography.fernet.InvalidToken 異常。在下麵的代碼片段中,生成 key 並將其附加到列表中。 MultiFernet 獲取第一個鍵並存儲在 f 變量中。該 key 用於將明文加密為密文。另一方麵,在解密過程中,MultiFernet嘗試列表中的所有 key 來解密密文。
Python3
# import Fernet and MultiFernet modules
from cryptography.fernet import Fernet, MultiFernet
# key generation
key1 = Fernet(Fernet.generate_key())
key2 = Fernet(Fernet.generate_key())
# the MultiFernet takes a list of Fernet instances
f = MultiFernet([key1, key2])
# encryption and token generation
token = f.encrypt(b"Welcome to GeeksForGeeks Python Module!")
# display the ciphertext
print(token)
# decryption of ciphertext to plaintext
d = f.decrypt(token)
#display the plaintext
#decode() method converts byte to string
print(d.decode())
輸出:
b’gAAAAABfYfRrB3f0RQl108YFuGyFHZ2lIQBKpFkuEqJ0EgLi6TNPR9vhElTmyuo5EfBivBwEBfSkOQJPEtIqOBBKZH8iElFn3ON5eg5d_JA1G9oARG7RKiqiQiOP8R22U4pIxnO1banH’
Welcome to GeeksForGeeks Python Module!
第二種方法
第二種方法演示了 key 輪換。鑰匙輪換可以輕鬆更換舊的或暴露的鑰匙。新 key 可以添加到現有 key 列表的前麵以開始加密新消息,並且舊 key 將被刪除,因為不再需要它們。 MultiFernet.rotate() 提供的令牌輪換限製了未檢測到事件時的損害,並增加了攻擊的難度或頻率。例如,如果有權訪問公司 fernet key 的員工離開,公司將需要生成新的 fernet key ,輪換當前使用新 key 部署的所有令牌,並刪除該員工有權訪問的舊 fernet key 。這可以通過 MultiFernet 輕鬆實現。
Python3
# import Fernet and MultiFernet modules
from cryptography.fernet import Fernet, MultiFernet
# key generation
key1 = Fernet(Fernet.generate_key())
key2 = Fernet(Fernet.generate_key())
# the MultiFernet takes a list of Fernet instances
f = MultiFernet([key1, key2])
# encryption and token generation
token = f.encrypt(b"Welcome to GeeksForGeeks Python Module!")
# display the ciphertext
print(token)
# decryption of ciphertext to plaintext
d = f.decrypt(token)
#display the plaintext
print(d.decode())
print('Key rotation')
key3 = Fernet(Fernet.generate_key())
f2 = MultiFernet([key3, key1, key2])
rotated = f2.rotate(token)
d2 = f2.decrypt(rotated)
print(d2.decode())
輸出:
b’gAAAAABfYfUe1Zh3JAa33k_RBRgkXgh-40jS6iqjXEq5Tc6jCeds-QY_nmlhzjkVBdZzeoExKj-YJsefBkgVSjUH1CVNG4080cwa3ZBHA9Aftx5upXzNQnaZ5fgeJacPNY0jcm4PMZSs’
Welcome to GeeksForGeeks Python Module!
Key rotation
Welcome to GeeksForGeeks Python Module!
相關用法
- Python Method Overloading用法及代碼示例
- Python Matplotlib.pyplot.tripcolor()用法及代碼示例
- Python Matplotlib.pyplot.subplot_tool()用法及代碼示例
- Python Matplotlib.pyplot.tricontour()用法及代碼示例
- Python Matplotlib.pyplot.show()用法及代碼示例
- Python Matplotlib.pyplot.subplots()用法及代碼示例
- Python Matplotlib.pyplot.tight_layout()用法及代碼示例
- Python Matplotlib.pyplot.twiny()用法及代碼示例
- Python Matplotlib.pyplot.twinx()用法及代碼示例
- Python Matplotlib.pyplot.ion()用法及代碼示例
- Python Matplotlib.pyplot.streamplot()用法及代碼示例
- Python Matplotlib.pyplot.matshow()用法及代碼示例
- Python Matplotlib.axes.Axes.annotate()用法及代碼示例
- Python Matplotlib.axes.Axes.hexbin()用法及代碼示例
- Python Matplotlib.axes.Axes.contourf()用法及代碼示例
- Python Matplotlib.axes.Axes.hist()用法及代碼示例
- Python Matplotlib.axes.Axes.contour()用法及代碼示例
- Python Matplotlib.axes.Axes.plot_date()用法及代碼示例
- Python Matplotlib.axes.Axes.axhline()用法及代碼示例
- Python Matplotlib.axes.Axes.text()用法及代碼示例
- Python Matplotlib.axes.Axes.clabel()用法及代碼示例
- Python Matplotlib.axes.Axes.arrow()用法及代碼示例
- Python Matplotlib.axes.Axes.bxp()用法及代碼示例
- Python Matplotlib.axes.Axes.boxplot()用法及代碼示例
- Python Matplotlib.axes.Axes.psd()用法及代碼示例
注:本文由純淨天空篩選整理自Shreyasi_Chakraborty大神的英文原創作品 MultiFernet Module in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。