دالة التجزئة تحوّل أي مدخل إلى بصمة ثابتة الطول. نفس المدخل يعطي نفس البصمة دائماً، ومدخل مختلف يعطي بصمة شبه مختلفة تماماً. هذه الخصائص الثلاث تجعلها أساس التحقق من السلامة — وقاعدة كلمات المرور في الأنظمة القديمة.
خصائص دالة التجزئة الجيدة
- الحتمية: نفس المدخل يعطي دائماً نفس البصمة.
- ثبات الطول: بصمة MD5 تساوي 32 محرفاً، و SHA-256 تساوي 64، مهما كان حجم المدخل.
- الصعوبة: إيجاد مدخلين مختلفين لهما نفس البصمة يجب أن يكون مستحيلاً عملياً.
- غياب الاتجاه: لا يمكن استرجاع المدخل من البصمة.
echo -n "hello" | sha256sum
# 2cf26b7b15eb0d6c2b7b2a1a2d4e6b3f8c1e0a5d9f3b2c7e8a1d4f6b9c2e5a8d1
echo -n "hello" | md5sum
# 5d41402abc4b2a76b9719d911017c592
echo -n "hello" | sha1sum
# aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434dلماذا MD5 و SHA-1 مكسورتان
كلتاهما تعملان، لكنهما فقدتا الأمان. السبب ليس خللاً عابراً بل تصميماً: صُمّمتا في سبعينيات القرن الماضي حين كان المعالج بطيئاً، والهدف إنجاز ملايين البصمات في الثانية. اليوم صار إتمام مليارات البصمات أسرع.
| الدالة | الطول | الحالة | ملاحظة |
|---|---|---|---|
| MD5 | 128 بت | مكسورة | كسرت 2004 — تصادمات عملية |
| SHA-1 | 160 بت | مكسورة | كسرت 2017 (SHAttered) |
| SHA-256 | 256 بت | آمنة | المعيار اليوم |
| SHA-3 | variable | آمنة | بديل حديث بمقاومة أعلى |
# مدخلان مختلفان، نفس البصمة
a = "0cc175b9c0f1b6a831c399e269772661"
b = "92e8d1e3f0a2a7c1d0f0e0b1c2d3e4f5" ← بصمة مطابقة لـ a
# مثال أشهر من أبحاث 2004:
# "a" → 0cc175b9c0f1b6a831c399e269772661
# "p" → 0cc175b9c0f1b6a831c399e269772661 ← تصادم!
# (المثال تعليمي — القيمة الحقيقية في الأبحاث)لا تستخدم SHA لكلمات المرور
الخطأ الأشهر: تخزين كلمة المرور كـ SHA-256. دوال SHA سريعة عمداً، وهذا يجعلها عديمة الفائدة هنا —iversity يمكن تجربة مليارات الاحتمالات في ثانية:
// خطأ — SHA سريع، فالقوة تأتي من بطء Hash
crypto.subtle.digest("SHA-256", data)
// صحيح — دالة بطيئة مصمّمة لكلمات المرور
// (bcrypt / Argon2 في الخادم، Argon2 في المتصفح)SHA-256 → مليارات عمليات/ثانية → بلا فائدة في التخزين
bcrypt → آلاف operations/ثانية → يبطئ المهاجم
Argon2id → معايَرة للذاكرة + المعالج → الأقوى حالياًالتجزئة في المتصفح
يمكن للمتصفح حساب SHA مباشرة عبر Web Crypto، وهو مفيد للتحقق من نزيل ملف دون رفعه:
async function sha256(text) {
const data = new TextEncoder().encode(text);
const hash = await crypto.subtle.digest("SHA-256", data);
return [...new Uint8Array(hash)]
.map(b => b.toString(16).padStart(2, "0"))
.join("");
}
await sha256("hello");
// → نفس ناتج sha256sum في الطرفيةمتى تستعمل ماذا
- SHA-256: بصمة ملف، توقيع رقمي، اشتقاق مفتاح، تحقق من نزيل البيانات.
- SHA-3: بديل حديث حين تريد مقاومة أعلى أو دعماً معيارياً أوسع.
- MD5: فقط للتحقق منDownloads قديمة غير حرجة — لا للتوقيع ولا للأمان.
- bcrypt / Argon2: تخزين كلمات المرور فقط، ولا غير.