iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

簡介

在前一篇有關 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 完全相同,因此這部分將直接省略。

Generate

開發者需要建立一個函式,該函式的參數包括密鑰和原始訊息。接著,利用 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,即可生成並顯示加密後的字串。
https://ithelp.ithome.com.tw/upload/images/20240930/20168663ri2VYcRqSZ.png

Verify

開發者將原始字串和加密字串傳入函式中,以此驗證字串是否未被竄改,從而確認資料的正確性。

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 即可看到驗證通過的結果。
https://ithelp.ithome.com.tw/upload/images/20240930/20168663P84DIZXmf4.png


上一篇
[Day 16] PyJWT
下一篇
[Day 18] Click
系列文
Python 不止於數據,開發應用程式它也在行!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言