Python中hmac的使用方法

引言

在Python中,hmac模塊提供了一種方便的方法來生成HMAC(基於哈希的消息驗證代碼)。HMAC是一種涉及哈希函數和一個秘密密鑰的消息認證碼,對於具有消息認證要求的應用程序而言,它是一種非常有用和安全的算法。

基本用法

hmac模塊實現了Python中的HMAC算法,可以用於數據完整性校驗、防篡改等應用。下面我們來看一個基本的示例,用於模擬一個用戶的登錄過程。

import hmac
import hashlib

def user_login(username, password):
    # 模擬從數據庫中獲取用戶信息
    db_password = 'e10adc3949ba59abbe56e057f20f883e' # 123456的MD5值
    key = 'mG8V37MFgqZH1mN9F7k3pEDQ' # 隨機生成的密鑰

    if hashlib.md5(password.encode('utf-8')).hexdigest() == db_password:
        message = '{}:{}:{}'.format(username, db_password, 'login')
        hmac_md5 = hmac.new(key.encode('utf-8'), message.encode('utf-8'), digestmod=hashlib.md5).hexdigest()
        return hmac_md5
    else:
        return 'password incorrect'

# 模擬登錄過程
username = 'admin'
password = '123456'
hmac_md5 = user_login(username, password)
print('hmac_md5:', hmac_md5)

上面這段示例代碼演示了一個用戶登錄的過程,先從數據庫中獲取用戶的密碼,然後將用戶名、密碼和操作(login)拼成一段字符串。接着使用HMAC算法計算這個字符串的消息摘要,並返回給用戶。

可以看到,這是一個基本的用法示例,只需要導入hmac和hashlib兩個庫,就可以方便地使用HMAC算法了。

HMAC的應用

應用一:防止篡改

HMAC可以用於確保數據的完整性,避免數據被篡改。以HTTP請求為例,我們可以在請求中添加一個HMAC簽名,服務器在接收到請求之後,使用同樣的方式計算HMAC簽名,然後將這個簽名與請求中的簽名進行對比。如果一致,說明數據沒有被篡改;否則說明數據已經被篡改。

import requests
import hmac
import hashlib

url = 'http://api.example.com/userinfo'
app_key = 'fnaHFNliU94fWl9a' # 應用的秘鑰
app_secret = 'v9a8sdfaxf9ajv0a89vsdjf98as' # 應用的密鑰

# 構造請求參數
params = {
    'app_id': '123456',
    'timestamp': '20190101 12:00:00',
    'username': 'test',
    'password': '123456'
}

# 計算HMAC簽名
message = '{}\n{}\n{}'.format(params['timestamp'], url, params)
signature = hmac.new(app_secret.encode('utf8'), message.encode('utf8'), digestmod=hashlib.sha256).hexdigest()

# 添加簽名到請求頭
headers = {
    'X-APP-SIGNATURE': signature,
}

# 發送POST請求
response = requests.post(url, headers=headers, data=params)
print('Response:', response.text)

這段示例代碼演示了如何在請求中添加HMAC簽名,並在服務器端進行驗證。其中,params是請求參數,message是計算HMAC簽名需要的消息體,signature是計算出來的HMAC簽名。將這個簽名添加到請求頭中,發送POST請求,並獲取響應結果。

應用二:加密通信

HMAC也可以和對稱加密算法一起使用,實現安全的通信。假設有兩個節點A和B要進行通信,它們事先共享一個秘鑰。在通信過程中,首先對明文進行加密(假定使用AES算法),然後對密文進行計算HMAC,並將HMAC附加到密文中一起發送給對端。對端接收到密文之後,先校驗HMAC的值,如果一致,則說明密文沒有被篡改;否則說明密文已經被篡改。接着再對密文進行解密,獲取明文內容。

import aes
import hmac
import hashlib

# 共享秘鑰
key = 'mG8V37MFgqZH1mN9F7k3pEDQ'

# 加密明文
plaintext = b'This is a secret message!'
cipher = aes.AESCipher(key, aes.MODE_CBC).encrypt(plaintext)

# 計算HMAC並添加到密文中
hmac_md5 = hmac.new(key.encode('utf-8'), cipher, digestmod=hashlib.md5).hexdigest()
message = cipher + hmac_md5.encode('utf-8')

# 接收端驗證HMAC
recv_cipher = message[:len(cipher)]
recv_hmac = message[len(recv_cipher):]
if hmac.new(key.encode('utf-8'), recv_cipher, digestmod=hashlib.md5).hexdigest() == recv_hmac.decode('utf-8'):
    plaintext = aes.AESCipher(key, aes.MODE_CBC).decrypt(recv_cipher)
    print('Plaintext:', plaintext)
else:
    print('HMAC verification failed!')

這段示例代碼演示了使用HMAC算法與對稱加密算法共同實現安全通信的過程。首先定義了一個共享秘鑰,然後將待加密的數據進行AES加密,接着使用HMAC算法計算消息摘要,並將其附加到密文中。通信的另一端接收到數據之後,首先驗證HMAC的值,如果一致,則說明密文沒有被篡改;否則說明數據已經被篡改。接着再對密文進行解密,獲取明文內容。

小結

本文對Python中HMAC的使用方法進行了介紹,從基本用法到實際應用,從防篡改到加密通信,多個方面闡述了HMAC的應用。通過本文的學習,比較全面了解了HMAC的使用方法,對於需要進行數據完整性校驗、數據防篡改、加密通信的應用場景有很大的幫助。

原創文章,作者:TFOXB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/317408.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
TFOXB的頭像TFOXB
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:27

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論