هش MD5 چیست؟
MD5 (الگوریتم خلاصهپیام ۵) یک تابع هش رمزنگاری است که یک خلاصه ثابت ۱۲۸ بیتی (۱۶ بایت) از هر ورودی، صرفنظر از اندازه آن، تولید میکند. این الگوریتم در سال ۱۹۹۲ توسط Ronald Rivest بهعنوان RFC 1321 منتشر شد و بهعنوان جانشین سریعتر MD4 طراحی شد و بهسرعت به یکی از پرکاربردترین توابع هش در اینترنت تبدیل شد. الگوریتم ورودی را در بلوکهای ۵۱۲ بیتی از طریق چهار دور ۱۶ عملیاتی پردازش میکند و در هر دور از یک تابع غیرخطی متفاوت استفاده میکند تا یک اثرانگشت هگز ۳۲ کاراکتری تولید کند.
یک تابع هش یک تبدیل یکطرفه است: با داشتن یک ورودی، میتوانید هش را فوری محاسبه کنید، اما با داشتن تنها هش، نمیتوانید ورودی اصلی را بازیابی کنید. حتی تغییر یک بیت در ورودی یک خلاصه کاملاً متفاوت تولید میکند — خاصیتی که اثر بهمنی نامیده میشود. MD5 یک فضای ورودی نامتناهی را به یک فضای خروجی ثابت ۱۲۸ بیتی نگاشت میکند، بنابراین تصادمها (دو ورودی متفاوت که هش یکسانی تولید میکنند) از نظر ریاضی قطعاً وجود دارند، اما یک تابع هش امن یافتن آنها را از نظر محاسباتی ناممکن میکند.
از سال ۲۰۰۴، محققان حملات تصادم عملی علیه MD5 را به اثبات رساندهاند، به این معنا که MD5 دیگر برای امضاهای دیجیتال، گواهیها، یا هر بافتی که مقاومت در برابر تصادم لازم است امن محسوب نمیشود. با این حال، MD5 هنوز برای اهداف غیرامنیتی بهطور گستردهای استفاده میشود: تأیید یکپارچگی فایل پس از دانلود، تولید کلیدهای کش، حذف تکراری محتوا، و ایجاد شناسههای قطعی از رشتهها. برای این کاربردها، سرعت الگوریتم و پشتیبانی گسترده کتابخانهها آن را به یک انتخاب عملی تبدیل میکند. در سال ۲۰۰۸، Marc Stevens و همکارانش یک حمله تصادم با پیشوند انتخابی منتشر کردند، به این معنا که مهاجم میتواند دو سند با پیشوندهای دلخواه انتخابی بسازد که خلاصه یکسانی دارند. این تکنیک در CCC ۲۰۰۸ (کائوس کامیونیکیشن کانگرس) با ساخت یک گواهی مرجع صدور جعلی به نمایش گذاشته شد. بدافزار Flame در سال ۲۰۱۲ متعاقباً از تصادمهای با پیشوند انتخابی برای جعل گواهی امضای کد Microsoft سوء استفاده کرد و به بدافزار اجازه داد بهعنوان یک بسته بهروزرسانی قانونی Windows Update ظاهر شود. این سوءاستفادههای واقعی تأیید کرد که این الگوریتم برای هر کاربردی که به پایه اعتماد متکی است از نظر رمزنگاری شکسته شده و نباید در جایی که مهاجم میتواند بر ورودیهای هششده تأثیر بگذارد به آن متکی شد.
RFC 1321 — The MD5 Message-Digest Algorithm →
چرا از این تولیدکننده MD5 استفاده کنیم؟
هشهای MD5 را فوری بدون نصب هیچ چیز یا نوشتن کد تولید کنید. متن خود را بچسبانید و خلاصه hex ۳۲ کاراکتری را در لحظه دریافت کنید.
موارد استفاده MD5
MD5 در مقابل سایر الگوریتمهای هش
MD5 سریعترین و کوتاهترین الگوریتم هش رایج است، اما ضعیفترین تضمینهای امنیتی را ارائه میدهد. جدول زیر اندازههای خلاصه، استانداردها، و موارد استفاده مناسب هر الگوریتم را مقایسه میکند.
| الگوریتم | اندازه خلاصه | طول Hex | استاندارد | بهترین کاربرد |
|---|---|---|---|---|
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums, non-security fingerprints |
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Legacy git commits (being replaced) |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, backup standard |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
نحوه کارکرد MD5
MD5 ورودی را از طریق یک ساختار Merkle-Damgård پردازش میکند: پیام تا مضربی از ۵۱۲ بیت padding میشود، به بلوکها تقسیم میشود، و هر بلوک از طریق چهار دور ۱۶ عملیات بیتی که ورودی را با ثابتهای مشتقشده از سینوس از پیش محاسبه شده ترکیب میکنند، عبور میکند. نتیجه یک وضعیت ۱۲۸ بیتی است که به خلاصه نهایی تبدیل میشود.
هر دور یک تابع کمکی غیرخطی متمایز را روی سه تا از چهار کلمه وضعیت ۳۲ بیتی (A، B، C، D) اعمال میکند. دور ۱ از F(B,C,D) = (B AND C) OR (NOT B AND D) استفاده میکند — یک انتخابگر شرطی بیتی. دور ۲ از G(B,C,D) = (B AND D) OR (C AND NOT D) استفاده میکند — یک انتخابگر مکمل. دور ۳ از H(B,C,D) = B XOR C XOR D استفاده میکند — یک تابع توازن. دور ۴ از I(B,C,D) = C XOR (B OR NOT D) استفاده میکند — یک ترکیبکننده نامتقارن. این چهار تابع تضمین میکنند که هر بیت ورودی بر خلاصه خروجی تأثیر میگذارد و اثر بهمنی را تولید میکنند که باعث میشود تغییرات کوچک ورودی تغییرات بزرگ و غیرقابل پیشبینی در هش نتیجه ایجاد کنند.
MD5: 5eb63bbbe01eeed093cb22bb8f5acdc3
(128 bits = 16 bytes = 32 hex characters)
الگوریتم در پنج مرحله پیش میرود: (۱) افزودن یک بیت ۱، سپس صفرها، تا زمانی که طول پیام ۴۴۸ mod 512 شود؛ (۲) افزودن طول اصلی پیام بهصورت یک عدد صحیح ۶۴ بیتی little-endian؛ (۳) مقداردهی اولیه چهار متغیر وضعیت ۳۲ بیتی (A، B، C، D) با مقادیر ثابت؛ (۴) پردازش هر بلوک ۵۱۲ بیتی از طریق ۶۴ عملیات با استفاده از چهار تابع غیرخطی (F، G، H، I)، یکی برای هر دور ۱۶ عملیاتی؛ (۵) افزودن وضعیت حاصل به جمع جاری و خروجی دادن هش نهایی ۱۲۸ بیتی به ترتیب بایت little-endian.
مثالهای کد
نحوه تولید هشهای MD5 در زبانها و محیطهای رایج. توجه داشته باشید که MD5 در Web Crypto API مرورگر موجود نیست — از یک کتابخانه یا Node.js استفاده کنید.
// MD5 is not available in Web Crypto API (it only supports SHA-*)
// Use a library like 'js-md5' or the Node.js crypto module
// Node.js (built-in crypto)
const crypto = require('crypto')
const hash = crypto.createHash('md5').update('hello world').digest('hex')
console.log(hash) // → "5eb63bbbe01eeed093cb22bb8f5acdc3"
// With Unicode input
crypto.createHash('md5').update('cafe\u0301').digest('hex')
// → "4fad076bae205e95bec9dacea498e2ab"import hashlib
# Basic MD5 hash
result = hashlib.md5(b'hello world').hexdigest()
print(result) # → "5eb63bbbe01eeed093cb22bb8f5acdc3"
# Hash a string (must encode to bytes first)
text = 'hello world'
hashlib.md5(text.encode('utf-8')).hexdigest()
# → "5eb63bbbe01eeed093cb22bb8f5acdc3"
# Hash a file
with open('file.bin', 'rb') as f:
md5 = hashlib.md5()
for chunk in iter(lambda: f.read(8192), b''):
md5.update(chunk)
print(md5.hexdigest())package main
import (
"crypto/md5"
"fmt"
)
func main() {
data := []byte("hello world")
hash := md5.Sum(data)
fmt.Printf("%x\n", hash)
// → 5eb63bbbe01eeed093cb22bb8f5acdc3
}# Using md5sum (Linux) or md5 (macOS) echo -n "hello world" | md5sum # → 5eb63bbbe01eeed093cb22bb8f5acdc3 - # macOS echo -n "hello world" | md5 # → 5eb63bbbe01eeed093cb22bb8f5acdc3 # Hash a file md5sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl md5 # → MD5(stdin)= 5eb63bbbe01eeed093cb22bb8f5acdc3