هش SHA-1 چیست؟
SHA-1 (الگوریتم هش امن ۱) یک تابع هش رمزنگاری است که از هر ورودی، یک خلاصه ثابت ۱۶۰ بیتی (۲۰ بایتی) تولید میکند. این الگوریتم توسط NSA طراحی و در سال ۱۹۹۵ توسط NIST بهعنوان FIPS PUB 180-1 استانداردسازی شد و بعداً در RFC 3174 مستند شد. SHA-1 بهعنوان جانشینی قویتر برای SHA-0 و MD5 طراحی شد. این الگوریتم ورودی را در بلوکهای ۵۱۲ بیتی پردازش کرده و طی ۸۰ دور عملیات بیتی، یک اثرانگشت ۴۰ کاراکتری هگزادسیمال تولید میکند که برای بیش از یک دهه ستون فقرات SSL/TLS، PGP، SSH و IPsec بود.
مانند همه توابع هش رمزنگاری، SHA-1 یک تبدیل یکطرفه است: محاسبه هش از ورودی سریع است، اما بازیابی ورودی صرفاً از روی هش از نظر محاسباتی غیرممکن است. تغییر حتی یک بیت در ورودی، یک خلاصه ۱۶۰ بیتی کاملاً متفاوت تولید میکند — خاصیتی که «اثر بهمن» نام دارد. SHA-1 یک فضای ورودی دلخواه را به خروجی ثابت ۱۶۰ بیتی نگاشت میکند، که یعنی تصادم (دو ورودی متفاوت با هش یکسان) از نظر ریاضی ناگزیر است. ادعای امنیتی یک تابع هش این است که یافتن چنین تصادمهایی باید تقریباً به ۲^۸۰ عملیات نیاز داشته باشد — نصف طول بیت خروجی.
در سال ۲۰۱۷، گوگل و CWI Amsterdam حمله SHAttered را منتشر کردند که اولین تصادم عملی SHA-1 را با تولید دو فایل PDF متفاوت با همان خلاصه نشان داد. این حمله تقریباً به ۲^۶۳.۱ محاسبه SHA-1 نیاز داشت — بسیار پایینتر از مرز نظری ۲^۸۰. در سال ۲۰۲۰، Gaetan Leurent و Thomas Peyrin با حمله تصادم پیشوند انتخابی هزینه را به حدود ۲^۶۳.۴ عملیات کاهش دادند. در نتیجه، همه مرورگرهای اصلی، مراجع گواهی و سازمانهای استانداردسازی SHA-1 را برای امضای دیجیتال و گواهیهای TLS منسوخ اعلام کردند. با این حال، SHA-1 برای اهداف غیرامنیتی هنوز استفاده میشود: شناسههای اشیاء Git (هرچند Git در حال مهاجرت به SHA-256 است)، ساختارهای HMAC قدیمی، و چکسامهای یکپارچگی فایل که در آنها مقاومت در برابر تصادم مخرب الزامی نیست.
NIST FIPS 180-4 — Secure Hash Standard →
چرا از این مولد SHA-1 استفاده کنیم؟
هشهای SHA-1 را بدون نصب چیزی یا نوشتن کد، فوری تولید کنید. متن خود را پیست کنید و خلاصه ۴۰ کاراکتری هگز را بلادرنگ دریافت کنید — برای تأیید چکسامهای قدیمی، اشکالزدایی داخلی Git، یا آزمایش گردشکارهای مبتنی بر هش مفید است.
موارد استفاده SHA-1
SHA-1 در مقابل سایر الگوریتمهای هش
SHA-1 یک خلاصه ۱۶۰ بیتی تولید میکند — طولانیتر از MD5 (128 بیت) اما بهطور قابل توجهی کوتاهتر از الگوریتمهای خانواده SHA-2. جدول زیر اندازههای خلاصه، استانداردها و موارد استفاده مناسب هر الگوریتم را مقایسه میکند.
| الگوریتم | اندازه خلاصه | طول هگز | استاندارد | بهترین کاربرد |
|---|---|---|---|---|
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Deprecated — legacy git commits, old TLS |
| 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 |
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums only — broken since 2004 |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, alternative to SHA-2 |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
نحوه عملکرد SHA-1
SHA-1 از ساختار Merkle-Damgard پیروی میکند: پیام padding میشود، به بلوکهای ۵۱۲ بیتی تقسیم میشود، و هر بلوک از طریق ۸۰ دور عملیات بیتی پردازش میشود که ورودی را با یک زمانبندی پیام مشتقشده از بلوک مخلوط میکند. پنج کلمه وضعیت ۳۲ بیتی (H0 تا H4) وضعیت هش در حال اجرا را حمل میکنند، و الحاق نهایی این کلمات خلاصه ۱۶۰ بیتی را تولید میکند.
SHA-1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
(160 bits = 20 bytes = 40 hex characters)
| مرحله | توضیح |
|---|---|
| Padding | Append a 1-bit, then zeros, until message length is 448 mod 512. Append the original length as a 64-bit big-endian integer. |
| Block splitting | Divide the padded message into 512-bit (64-byte) blocks. |
| Expansion | Expand each 16-word block into 80 words using a left-rotate-by-1 XOR feedback schedule. |
| Compression | Process 80 rounds per block using four nonlinear functions (Ch, Parity, Maj, Parity) across rounds 0-19, 20-39, 40-59, and 60-79. |
| Output | Concatenate the five 32-bit state words (H0-H4) into a 160-bit (20-byte) digest, rendered as 40 hexadecimal characters. |
تفاوت کلیدی بین SHA-1 و MD5 در تعداد کلمات وضعیت (۵ در مقابل ۴)، تعداد دورها در هر بلوک (۸۰ در مقابل ۶۴)، و استفاده از زمانبندی پیام با بازخورد چرخش چپ است. این تفاوتها به SHA-1 یک خروجی بزرگتر (160 در مقابل 128 بیت) میدهند و در ابتدا حاشیه امنیتی بالاتری فراهم میکردند، هرچند هر دو الگوریتم اکنون برای مقاومت در برابر تصادم شکسته شده تلقی میشوند.
نمونه کد
نحوه تولید هشهای SHA-1 در زبانها و محیطهای محبوب. برخلاف MD5، SHA-1 در Web Crypto API مرورگر در دسترس است و آن را در هر دو محیط مرورگر و Node.js بدون کتابخانههای خارجی قابل استفاده میکند.
// SHA-1 is available in the Web Crypto API
async function sha1(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-1', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha1('hello world')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha1').update('hello world').digest('hex')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"import hashlib
# Basic SHA-1 hash
result = hashlib.sha1(b'hello world').hexdigest()
print(result) # → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a string (encode to bytes first)
text = 'hello world'
hashlib.sha1(text.encode('utf-8')).hexdigest()
# → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a file in chunks
with open('file.bin', 'rb') as f:
sha1 = hashlib.sha1()
for chunk in iter(lambda: f.read(8192), b''):
sha1.update(chunk)
print(sha1.hexdigest())package main
import (
"crypto/sha1"
"fmt"
)
func main() {
data := []byte("hello world")
hash := sha1.Sum(data)
fmt.Printf("%x\n", hash)
// → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
}# Using sha1sum (Linux) or shasum (macOS) echo -n "hello world" | sha1sum # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # macOS echo -n "hello world" | shasum -a 1 # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # Hash a file sha1sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl sha1 # → SHA1(stdin)= 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed