معرف البصمة
تحديد نوع البصمة حسب الطول والتنسيق — MD5 و SHA-1 و SHA-256 والمزيد
سلسلة البصمة
ما هو تعرُّف الـ Hash؟
تعرُّف الـ Hash هو عملية تحديد خوارزمية التجزئة التشفيرية التي أنتجت ملخصًا معيَّنًا. تنتج دوال التجزئة التشفيرية مثل MD5 وSHA-1 وSHA-256 مخرجاتٍ ذات طول ثابت، ويُعدّ طول المخرج الإشارةَ الرئيسية لتعرُّف hash مجهول. عندما تصادف سلسلة نصية سداسية عشرية في تفريغ قاعدة بيانات أو ملف إعدادات أو استجابة API، تخبرك أداة تعرُّف الـ hash بالخوارزمية التي أنتجتها على الأرجح.
تربط كل خوارزمية تجزئة بيانات المدخل بمخرج ذي حجم ثابت يُسمى الملخص (digest). ينتج MD5 دائمًا 128 بت (32 حرفًا سداسيًا عشريًا)، وينتج SHA-1 دائمًا 160 بت (40 حرفًا)، وينتج SHA-256 دائمًا 256 بت (64 حرفًا). هذا الطول الحتمي للمخرج هو ما يُتيح التعرُّف على الخوارزمية دون الحاجة إلى المدخل الأصلي أو الشيفرة البرمجية للتجزئة.
لا يكون التعرُّف استنادًا إلى الطول وحده حاسمًا في جميع الأحيان؛ إذ تتشارك عدة خوارزميات حجم المخرج ذاته — فمثلًا، يُنتج كلٌّ من SHA-256 وSHA3-256 ملخصاتٍ سداسية عشرية من 64 حرفًا. في هذه الحالات، تُقدّم أداة التعرُّف قائمةً بالخوارزميات المرشَّحة مرتَّبةً حسب الشيوع. وتُساعد القرائن السياقية كنظام المصدر وصيغة الترميز (hex مقابل Base64) ووجود بادئات الخوارزميات (مثل '$2b$' لـ bcrypt) على تضييق نطاق الاحتمالات.
لماذا تستخدم أداة تعرُّف الـ Hash؟
تظهر الـ hashes المجهولة بانتظام أثناء عمليات التدقيق الأمني وترحيل قواعد البيانات والتحليل الجنائي الرقمي. تُزيل أداة التعرُّف التخمينَ وتُرشدك إلى الخوارزمية الصحيحة في ثوانٍ.
حالات استخدام أداة تعرُّف الـ Hash
مرجع أطوال خوارزميات الـ Hash
يربط الجدول أدناه كل خوارزمية hash شائعة بحجم مخرجها بالبت وعدد الأحرف السداسية العشرية والبايتات الخام. هذا هو جدول البحث الأساسي الذي تستخدمه أدوات تعرُّف الـ hash. عندما تتشارك خوارزميات متعددة في طول hex واحد، تحتاج إلى سياق إضافي للتمييز بينها.
| الخوارزمية | البتات | أحرف Hex | البايتات | ملاحظات |
|---|---|---|---|---|
| MD5 | 128 | 32 | 16 | Broken — collisions trivial since 2004 |
| SHA-1 | 160 | 40 | 20 | Deprecated — SHAttered attack (2017) |
| SHA-224 | 224 | 56 | 28 | Truncated SHA-256; rarely used standalone |
| SHA-256 | 256 | 64 | 32 | Current standard; TLS, Git, Bitcoin |
| SHA-384 | 384 | 96 | 48 | Truncated SHA-512; CNSA Suite approved |
| SHA-512 | 512 | 128 | 64 | Maximum SHA-2 output; large-data hashing |
| SHA3-256 | 256 | 64 | 32 | Keccak-based; NIST alternative to SHA-2 |
| SHA3-512 | 512 | 128 | 64 | Keccak-based; highest SHA-3 strength |
| RIPEMD-160 | 160 | 40 | 20 | Used in Bitcoin address derivation |
| BLAKE2s | 256 | 64 | 32 | Faster than SHA-256; 256-bit output |
التمييز بين أطوال الـ Hash المتشابهة
تُطابق بعض أطوال hex خوارزميات متعددة. أكثر حالتَي التباس شيوعًا هما hashes من 64 حرفًا (SHA-256 مقابل SHA3-256) وhashes من 40 حرفًا (SHA-1 مقابل RIPEMD-160). إليك كيفية التمييز بينها حين لا يكفي الطول وحده.
أمثلة برمجية
فيما يلي تطبيقات عملية لتعرُّف الـ hash بناءً على طول hex بأربع لغات برمجية. تتحقق كل دالة من صحة الترميز السداسي العشري، وتبحث عن عدد الأحرف، وتُعيد جميع الخوارزميات المطابقة.
function identifyHash(hex) {
const len = hex.length
const isHex = /^[0-9a-fA-F]+$/.test(hex)
if (!isHex) return ['Not a hex-encoded hash']
const map = {
32: ['MD5'],
40: ['SHA-1', 'RIPEMD-160'],
56: ['SHA-224', 'SHA3-224'],
64: ['SHA-256', 'SHA3-256', 'BLAKE2s'],
96: ['SHA-384', 'SHA3-384'],
128: ['SHA-512', 'SHA3-512', 'BLAKE2b'],
}
return map[len] || [`Unknown (${len} hex chars)`]
}
identifyHash('d41d8cd98f00b204e9800998ecf8427e')
// → ["MD5"]
identifyHash('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855')
// → ["SHA-256", "SHA3-256", "BLAKE2s"]import re
HASH_LENGTHS = {
32: ['MD5'],
40: ['SHA-1', 'RIPEMD-160'],
56: ['SHA-224', 'SHA3-224'],
64: ['SHA-256', 'SHA3-256', 'BLAKE2s'],
96: ['SHA-384', 'SHA3-384'],
128: ['SHA-512', 'SHA3-512', 'BLAKE2b'],
}
def identify_hash(hex_string: str) -> list[str]:
hex_string = hex_string.strip()
if not re.fullmatch(r'[0-9a-fA-F]+', hex_string):
return ['Not a hex-encoded hash']
return HASH_LENGTHS.get(len(hex_string), [f'Unknown ({len(hex_string)} hex chars)'])
identify_hash('da39a3ee5e6b4b0d3255bfef95601890afd80709')
# → ['SHA-1', 'RIPEMD-160']
identify_hash('a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a')
# → ['SHA-256', 'SHA3-256', 'BLAKE2s']package main
import (
"fmt"
"regexp"
)
var hexPattern = regexp.MustCompile("^[0-9a-fA-F]+$")
var hashLengths = map[int][]string{
32: {"MD5"},
40: {"SHA-1", "RIPEMD-160"},
56: {"SHA-224", "SHA3-224"},
64: {"SHA-256", "SHA3-256", "BLAKE2s"},
96: {"SHA-384", "SHA3-384"},
128: {"SHA-512", "SHA3-512", "BLAKE2b"},
}
func identifyHash(hex string) []string {
if !hexPattern.MatchString(hex) {
return []string{"Not a hex-encoded hash"}
}
if algos, ok := hashLengths[len(hex)]; ok {
return algos
}
return []string{fmt.Sprintf("Unknown (%d hex chars)", len(hex))}
}
func main() {
fmt.Println(identifyHash("d41d8cd98f00b204e9800998ecf8427e"))
// → [MD5]
}#!/bin/bash
# Identify a hash from the command line by character count
hash="$1"
if [[ ! "$hash" =~ ^[0-9a-fA-F]+$ ]]; then
echo "Not a hex-encoded hash"
exit 1
fi
len=${#hash}
case $len in
32) echo "MD5 (128-bit)" ;;
40) echo "SHA-1 or RIPEMD-160 (160-bit)" ;;
56) echo "SHA-224 or SHA3-224 (224-bit)" ;;
64) echo "SHA-256 or SHA3-256 (256-bit)" ;;
96) echo "SHA-384 or SHA3-384 (384-bit)" ;;
128) echo "SHA-512 or SHA3-512 (512-bit)" ;;
*) echo "Unknown hash length: $len chars" ;;
esac
# Usage: ./identify.sh d41d8cd98f00b204e9800998ecf8427e
# → MD5 (128-bit)