ویژگی تصویر

معرفی کتابخانه hmac در پایتون

  /  پایتون   /  کتابخانه hmac در پایتون
بنر تبلیغاتی الف

کتابخانه hmac در پایتون ابزاری ساده و استاندارد برای تولید و بررسی HMAC (Hash-based Message Authentication Code) است. HMAC روشی برای تضمین صحت و یکپارچگی پیام همراه با احراز هویت کلیدمحور است. این ماژول بخشی از کتابخانهٔ استاندارد پایتون است و پیاده‌سازی آن براساس RFC 2104 انجام شده است.

چرا HMAC مهم است؟

HMAC به شما اجازه می‌دهد تا با اشتراک یک کلید محرمانه بین فرستنده و گیرنده، از تغییر یا جعل پیام جلوگیری کنید. برخلاف هش ساده، HMAC از کلید استفاده می‌کند و در برابر حملات پیشرفته مقاوم‌تر است. استفادهٔ صحیح از HMAC در APIها، وب‌هوک‌ها، توکن‌ها و پروتکل‌های سبک مانند JWT مرسوم است.

توابع اصلی و استفاده ساده

تابع اصلی در ماژول hmac، hmac.new است که ساختار کلی زیر را دارد:

import hmac
import hashlib

key = b'secret-key'
message = b'important message'

mac = hmac.new(key, message, hashlib.sha256)
digest_hex = mac.hexdigest()
print(digest_hex)

در این کد یک مک (MAC) با استفاده از SHA-256 تولید می‌شود. خروجی به صورت هگزا دسیمال است. توجه کنید که کلید و پیام باید از نوع bytes باشند؛ در صورت داشتن str باید با .encode() تبدیل شوند.

مثال تولید و بررسی HMAC (سرور/کلاینت)

# Client-side: تولید امضا
import hmac, hashlib, base64

key = b'shared-secret'
data = b'{"user": "alice", "amount": 100}'

signature = hmac.new(key, data, hashlib.sha256).digest()
signature_b64 = base64.b64encode(signature).decode()
print('Signature:', signature_b64)

# Server-side: بررسی امضا
received_signature_b64 = signature_b64  # از درخواست واقعی گرفته می‌شود
received_signature = base64.b64decode(received_signature_b64)

expected_signature = hmac.new(key, data, hashlib.sha256).digest()
if hmac.compare_digest(expected_signature, received_signature):
    print('Valid message')
else:
    print('Invalid message')

در این سناریو از Base64 برای انتقال امن بایت‌های امضا استفاده شده است و برای جلوگیری از حملات زمانی (timing attacks) از hmac.compare_digest برای مقایسهٔ ثابت‌زمانی استفاده می‌شود. مقایسهٔ معمولی با == می‌تواند آسیب‌پذیر باشد.

مقایسهٔ مقایسهٔ معمولی با compare_digest

import hmac
# خطر: مقایسهٔ ناامن
if expected_signature == received_signature:
    print("OK")

این روش ممکن است به حملات زمانی آسیب‌پذیر باشد. جایگزین امن:

import hmac
# امن: مقایسهٔ ثابت‌زمانی
if hmac.compare_digest(expected_signature, received_signature):
    print("OK")

hmac.compare_digest به گونه‌ای پیاده‌سازی شده که زمان اجرای آن مستقل از محل اختلاف در آرایهٔ بایت‌ها است، بنابراین اطلاعات زمانی به مهاجم نشت نمی‌کند.

کار با پیام‌های بزرگ و استریم

اگر پیام‌ها بزرگ یا تدریجی هستند، می‌توان از متد update استفاده کرد تا حافظهٔ کمتری مصرف شود:

import hmac, hashlib

key = b'secret'
h = hmac.new(key, digestmod=hashlib.sha256)

# فرض کنید داده به صورت تکه‌ای (chunks) دریافت می‌شود
for chunk in [b'part1', b'part2', b'part3']:
    h.update(chunk)

print(h.hexdigest())

این روش مناسب پردازش فایل‌ها یا استریم‌های طولانی است، چرا که نیاز به بارگذاری کامل پیام در حافظه ندارد.

نکات کلیدی و بهترین رویه‌ها

  • از الگوریتم‌های قوی مانند SHA-256 یا SHA-3 استفاده کنید؛ از SHA-1 برای کاربردهای جدید پرهیز کنید.
  • کلیدها را به صورت تصادفی و با طول مناسب تولید کنید (حداقل 128 بیت، یا 256 بیت برای امنیت بالاتر) و آن‌ها را ایمن ذخیره کنید.
  • هرگز از رمز عبور خام به عنوان کلید HMAC استفاده نکنید؛ در صورت نیاز از KDF یا HKDF استفاده کنید تا کلید مناسب مشتق شود.
  • برای مقایسه امضاها حتماً از hmac.compare_digest استفاده کنید تا از حملات زمانی جلوگیری شود.
  • HMAC برای تضمین صحت و احراز هویت مناسب است، اما رمزنگاری و محرمانگی پیام را تأمین نمی‌کند؛ برای محرمانگی از الگوریتم‌های رمزنگاری (مثل AES-GCM) استفاده کنید.

مقایسهٔ سریع: HMAC در برابر امضاهای دیجیتال

ویژگیHMACامضای دیجیتال (مثلاً RSA/ECDSA)
نیاز به کلید مشترکبلهخیر (کلید عمومی/خصوصی)
سرعتسریع‌ترکندتر
مناسب برایارتباطات بین سرویس‌های دارای کلید مشترک، APIهای داخلیمورد نیاز برای عدم انکار و توافقات عمومی

اشتباهات رایج و چگونگی اجتناب

  • استفاده از کلیدهای کوتاه یا قابل حدس: همیشه از منبع تصادفی امن (secrets.token_bytes) استفاده کنید.
  • مقایسهٔ غیرایمن با == : همیشه compare_digest استفاده شود.
  • اعتماد به HMAC برای محرمانگی: HMAC فقط احراز هویت است، نه رمزنگاری.
  • استفادهٔ مستقیم از رشته‌ها بدون encode: همواره داده‌ها و کلیدها را به bytes تبدیل کنید.

الگوهای کاربردی و موارد استفاده

  • امضای payload در APIهای REST برای جلوگیری از جعل درخواست.
  • اعتبارسنجی وب‌هوک‌ها که از طرف سرویس‌های ثالث ارسال می‌شوند.
  • تأیید یکپارچگی فایل‌ها یا لاگ‌ها در سیستم‌های توزیع‌شده.
  • به عنوان بخشی از ساختار توکن‌های ساده یا نشست (session tokens).

جمع‌بندی فنی

ماژول hmac در پایتون یک ابزار استاندارد، امن و کارآمد برای تولید و تأیید MAC است. با رعایت نکات امنیتی مثل استفاده از الگوریتم‌های قوی، کلیدهای طولانی و compare_digest، می‌توان از آن در سناریوهای متعددی بهره برد. به خاطر داشته باشید که HMAC ابزار احراز هویت و یکپارچگی است و جایگزینی برای رمزنگاری جهت محرمانگی نیست.

در صورت نیاز به نمونه‌های پیشرفته‌تر (ترکیب با KDF، استفاده در پروتکل‌های توزیع‌شده یا ذخیرهٔ امن کلیدها) می‌توان مثال‌های کاربردیِ بیشتری ارائه کرد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: