在前一篇有關 JWT 的文章中,我們提到了加密演算法。JWT 透過加密和解密技術來防止資訊被竄改。此外,當 Web Application 使用密碼登入時,必須以加密的方式儲存使用者密碼,而不能直接存儲原始密碼。這樣做是為了保護使用者的敏感資訊,防止在資料外洩時密碼被暴露。因此,應用程式通常會廣泛使用加密技術。
在 Python 中,最常用的加密套件是 Cryptography,該套件提供了多種加密演算法和工具,讓開發者可以根據自身需求選擇合適的加密技術。本文將介紹在前篇有提到的加密技術,它是常用於 JSON Web Token(JWT)的加密技術——HMAC-SHA256,簡稱 HS256。HS256 是一種訊息驗證技術,旨在驗證資料的完整性,確保資料在傳輸過程中未被篡改。
首先,應用程式需要準備一把密鑰,也就是在前一篇的 PyJWT 設定檔 .env
中的 SECRET_KEY
。接著,將字串和密鑰作為輸入,通過 HMAC-SHA256 演算法即可生成一個加密字串。該加密字串是不可逆的,因此無法從中恢復原始資料。當應用程式想要驗證加密字串是否被竄改時,則會使用相同的密鑰進行驗證。接下來,我將透過範例進一步介紹這個過程。
poetry add cryptography==43.0.1
與前一篇的 PyJWT 範例相同,本次範例同樣分為三個部分:第一部分是設定檔,用於配置密鑰參數;第二部分是生成加密字串;最後,第三部分則是驗證加密字串是否未被竄改。由於第一部分的設定檔與前一篇 PyJWT 完全相同,因此這部分將直接省略。
開發者需要建立一個函式,該函式的參數包括密鑰和原始訊息。接著,利用 HMAC 加上 SHA256 來組成 HS256 加密演算法。為了便於傳輸和儲存,通常會將加密的成果轉換成 Base64 編碼。
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.hmac import HMAC
import base64
from settings import settings
def generate_hmac(key, message):
# 將字串轉換為 bytes
key_bytes = key.encode()
message_bytes = message.encode()
# 創建 HMAC 實例並生成 HMAC
h = HMAC(key_bytes, hashes.SHA256())
h.update(message_bytes)
hmac_value = h.finalize()
# 返回 HMAC 的 Base64 編碼
return base64.urlsafe_b64encode(hmac_value).decode()
if __name__ == '__main__':
message = input('Please enter message: ')
print(f"Result: {generate_hmac(settings.secret_key, message)}")
執行 poetry run python generate.py
,即可生成並顯示加密後的字串。
開發者將原始字串和加密字串傳入函式中,以此驗證字串是否未被竄改,從而確認資料的正確性。
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.hmac import HMAC
import base64
from settings import settings
def verify_hmac(key: str, message: str, hmac_signature):
key_bytes = key.encode()
message_bytes = message.encode()
hmac_signature_bytes = base64.urlsafe_b64decode(hmac_signature)
# 創建 HMAC 實例以進行驗證
h = HMAC(key_bytes, hashes.SHA256())
h.update(message_bytes)
try:
# 驗證 HMAC
h.verify(hmac_signature_bytes)
return True
except Exception as e:
return False
if __name__ == '__main__':
message = input('Please enter message: ')
hmac_signature = input("Please enter HMAC Signature: ")
print(f"Result: {verify_hmac(settings.secret_key, message, hmac_signature)}")
執行 poetry run python verify.py
即可看到驗證通過的結果。