SHA-1 হ্যাশিং কী?
SHA-1 (Secure Hash Algorithm 1) একটি ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন যা যেকোনো ইনপুট থেকে একটি নির্দিষ্ট 160-bit (20-byte) ডাইজেস্ট তৈরি করে। NSA কর্তৃক ডিজাইন করা এবং ১৯৯৫ সালে NIST দ্বারা FIPS PUB 180-1 হিসেবে প্রমিত (পরে RFC 3174-এ নথিভুক্ত), SHA-1 SHA-0 ও MD5-এর চেয়ে শক্তিশালী উত্তরসূরি হিসেবে তৈরি হয়েছিল। অ্যালগরিদমটি ইনপুটকে 512-bit ব্লকে বিভক্ত করে 80 রাউন্ড বিটওয়াইজ অপারেশনের মধ্য দিয়ে প্রক্রিয়া করে এবং একটি 40-অক্ষরের হেক্সাডেসিমাল ফিঙ্গারপ্রিন্ট তৈরি করে, যা এক দশকেরও বেশি সময় ধরে SSL/TLS, PGP, SSH এবং IPsec-এর মেরুদণ্ড হিসেবে কাজ করেছে।
সব ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনের মতো SHA-1-ও একটি একমুখী রূপান্তর: ইনপুট থেকে হ্যাশ গণনা করা দ্রুত, কিন্তু শুধুমাত্র হ্যাশ থেকে ইনপুট পুনরুদ্ধার করা ব্যবহারিকভাবে অসম্ভব। ইনপুটে একটি মাত্র বিট পরিবর্তন সম্পূর্ণ আলাদা 160-bit ডাইজেস্ট তৈরি করে — এই বৈশিষ্ট্যকে avalanche effect বলা হয়। SHA-1 যেকোনো আকারের ইনপুটকে একটি নির্দিষ্ট 160-bit আউটপুটে ম্যাপ করে, তাই collision (দুটি ভিন্ন ইনপুট একই হ্যাশ তৈরি করে) গাণিতিকভাবে অবশ্যম্ভাবী। হ্যাশ ফাংশনের নিরাপত্তার দাবি হল এমন collision খুঁজে পেতে প্রায় 2^80 অপারেশন প্রয়োজন হওয়া উচিত।
২০১৭ সালে Google ও CWI Amsterdam SHAttered আক্রমণ প্রকাশ করে, একই ডাইজেস্টযুক্ত দুটি ভিন্ন PDF ফাইল তৈরি করে প্রথম বাস্তবসম্মত SHA-1 collision প্রদর্শন করে। এই আক্রমণে প্রায় 2^63.1 SHA-1 গণনা প্রয়োজন হয়েছিল — তাত্ত্বিক 2^80 সীমার অনেক নিচে। ২০২০ সালে Gaetan Leurent ও Thomas Peyrin একটি chosen-prefix collision আক্রমণ দিয়ে খরচ আরও কমিয়েছেন। ফলে সব প্রধান ব্রাউজার, সার্টিফিকেট কর্তৃপক্ষ এবং মানদণ্ড সংস্থাগুলি ডিজিটাল স্বাক্ষর ও TLS সার্টিফিকেটের জন্য SHA-1 বাতিল করেছে। তবে অ-নিরাপত্তামূলক ব্যবহারে SHA-1 এখনও সক্রিয়: Git অবজেক্ট ID (যদিও Git SHA-256-এ মাইগ্রেট হচ্ছে), লিগ্যাসি HMAC কনস্ট্রাকশন এবং ফাইল ইন্টিগ্রিটি চেকসাম যেখানে প্রতিকূল collision প্রতিরোধ প্রয়োজন নেই।
NIST FIPS 180-4 — Secure Hash Standard →
এই SHA-1 জেনারেটর কেন ব্যবহার করবেন?
কিছু ইনস্টল না করে বা কোড না লিখে তাৎক্ষণিকভাবে SHA-1 হ্যাশ তৈরি করুন। আপনার টেক্সট পেস্ট করুন এবং রিয়েল টাইমে 40-অক্ষরের হেক্স ডাইজেস্ট পান — লিগ্যাসি চেকসাম যাচাই করতে, Git ইন্টার্নাল ডিবাগ করতে বা হ্যাশ-ভিত্তিক ওয়ার্কফ্লো পরীক্ষা করতে কাজে আসে।
SHA-1-এর ব্যবহারক্ষেত্র
SHA-1 বনাম অন্যান্য হ্যাশ অ্যালগরিদম
SHA-1 একটি 160-bit ডাইজেস্ট তৈরি করে — MD5 (128 bit)-এর চেয়ে বড় কিন্তু 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 কনস্ট্রাকশন অনুসরণ করে: মেসেজটি প্যাড করা হয়, 512-bit ব্লকে বিভক্ত হয় এবং প্রতিটি ব্লক 80 রাউন্ড বিটওয়াইজ অপারেশনের মধ্য দিয়ে প্রক্রিয়া করা হয় যা ব্লক থেকে প্রাপ্ত মেসেজ শিডিউলের সাথে ইনপুট মিশ্রিত করে। পাঁচটি 32-bit স্টেট ওয়ার্ড (H0 থেকে H4) চলমান হ্যাশ স্টেট বহন করে এবং এই শব্দগুলির চূড়ান্ত সংযোজন 160-bit ডাইজেস্ট তৈরি করে।
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-এর মধ্যে মূল পার্থক্য হল স্টেট ওয়ার্ডের সংখ্যা (5 বনাম 4), প্রতি ব্লকে রাউন্ডের সংখ্যা (80 বনাম 64) এবং left-rotate ফিডব্যাকসহ মেসেজ শিডিউলের ব্যবহার। এই পার্থক্যগুলি SHA-1-কে বৃহত্তর আউটপুট (160 বনাম 128 bit) এবং মূলত উচ্চতর নিরাপত্তা মার্জিন দেয়, যদিও উভয় অ্যালগরিদমই এখন collision প্রতিরোধের জন্য দুর্বল বলে বিবেচিত।
কোড উদাহরণ
জনপ্রিয় ভাষা ও পরিবেশে 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