التجزئة التشفيرية باستخدام MessageDigest
جزّئ كلمات المرور باستخدام SHA-256، وأضف salt لمنع هجمات جداول قوس قزح، وقارن الملخصات بأمان
التجزئة التشفيرية باستخدام MessageDigest درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما المقصود بالتجزئة التشفيرية؟
تربط دالة التجزئة التشفيرية البيانات، مهما كان حجمها، بملخص ذي حجم ثابت. وهي أحادية الاتجاه (لا يمكن عكسها)، وحتمية، ومقاومة للتصادمات. وتُستخدم لتخزين كلمات المرور وسلامة البيانات والتوقيعات الرقمية.
واجهة MessageDigest البرمجية
تعيد MessageDigest.getInstance("SHA-256") أداة تجزئة SHA-256. استدعِ digest(bytes) لحساب التجزئة والحصول على مصفوفة بايتات.
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest("password123".getBytes(StandardCharsets.UTF_8));
String hex = HexFormat.of().formatHex(hash);
System.out.println(hex); // 64-char hex stringالخوارزميات الشائعة
يدعم JDK ما يلي: MD5 (مكسورة — لا تستخدمها للأمان)، وSHA-1 (مهجورة لأغراض الأمان)، وSHA-256 (قياسية)، وSHA-512 (أقوى)، وSHA3-256 (حديثة). استخدم دائمًا SHA-256 أو SHA-512 في الشيفرة الجديدة.
MessageDigest.getInstance("SHA-256"); // recommended
MessageDigest.getInstance("SHA-512"); // stronger
MessageDigest.getInstance("SHA3-256"); // SHA-3 family
// Never: MessageDigest.getInstance("MD5"); // cryptographically brokenتحويل التجزئة إلى سلسلة سداسية عشرية
يجب تحويل نتيجة مصفوفة البايتات إلى سلسلة سداسية عشرية لتخزينها أو مقارنتها. استخدم HexFormat (في Java 17+) أو String.format للإصدارات الأقدم.
// Java 17+:
String hex = HexFormat.of().formatHex(hash);
// Older Java:
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
String hex = sb.toString();Salt: التغلب على جداول Rainbow
يربط جدول Rainbow كلمات المرور الشائعة بتجزئاتها. تؤدي إضافة قيمة عشوائية إلى كل كلمة مرور قبل تجزئتها إلى جعل جداول Rainbow عديمة الفائدة. خزّن قيمة salt إلى جانب التجزئة.
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
byte[] hash = md.digest("password".getBytes(StandardCharsets.UTF_8));
// Store: Base64.encode(salt) + ":" + Base64.encode(hash)تجزئة كلمات المرور — استخدم BCrypt بدلًا منها
استخدام SHA-256 مع salt أفضل من استخدام SHA-256 العادي، لكنه لا يزال سريعًا؛ إذ يستطيع المهاجم تجربة مليارات التخمينات في الثانية. استخدم KDF بطيئًا: BCryptPasswordEncoder (في Spring Security) أو PBKDF2 أو Argon2 لكلمات المرور.
// Spring Security — proper password hashing:
PasswordEncoder encoder = new BCryptPasswordEncoder(12); // cost factor 12
String hash = encoder.encode("password123");
boolean match = encoder.matches("password123", hash); // trueالتحقق من سلامة الملفات
احسب تجزئة الملف لاكتشاف تلفه أو العبث به. قارن التجزئة المحسوبة بمرجع معروف بصحته.
MessageDigest md = MessageDigest.getInstance("SHA-256");
try (InputStream is = Files.newInputStream(Path.of("app.jar"))) {
byte[] buf = new byte[8192];
int n;
while ((n = is.read(buf)) > 0) md.update(buf, 0, n);
}
String hash = HexFormat.of().formatHex(md.digest());
System.out.println("SHA-256: " + hash);مقارنة التجزئات بأمان
استخدم MessageDigest.isEqual() للمقارنة بزمن ثابت لمنع هجمات التوقيت. لا تستخدم String.equals() لمقارنة التجزئات.
byte[] expected = computeHash(storedHash);
byte[] actual = computeHash(inputPassword);
boolean match = MessageDigest.isEqual(expected, actual); // constant-timeتسلسل عمليات التحديث
استدعِ md.update(bytes) عدة مرات قبل md.digest() لتجزئة البيانات التي تصل على أجزاء (بثًا).
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("part1".getBytes());
md.update("part2".getBytes());
byte[] hash = md.digest(); // hash of "part1" + "part2"ترميز التجزئات للتخزين
خزّن التجزئات الثنائية بصيغة Base64 (وهي أقصر من التمثيل السداسي عشري) أو كسلاسل سداسية عشرية. تستخدم Base64 عدد 43 محرفًا لـ SHA-256، مقابل 64 محرفًا للتمثيل السداسي عشري. كلاهما صحيح، لكن احرص على الاتساق.
byte[] hash = md.digest(data);
String base64 = Base64.getEncoder().encodeToString(hash); // 44 chars (with padding)
String hex = HexFormat.of().formatHex(hash); // 64 charsDigestInputStream للبث
غلّف InputStream بـ DigestInputStream لحساب التجزئة أثناء القراءة، مما يتجنب تحميل الملف كاملًا إلى الذاكرة.
MessageDigest md = MessageDigest.getInstance("SHA-256");
try (DigestInputStream dis = new DigestInputStream(Files.newInputStream(path), md)) {
dis.transferTo(OutputStream.nullOutputStream());
}
String hash = HexFormat.of().formatHex(md.digest());تحقق سريع
لماذا لا يُنصح باستخدام SHA-256 مع salt لتخزين كلمات المرور؟
مراجعة
استخدم MessageDigest.getInstance("SHA-256") للتحقق من سلامة البيانات. أضف دائمًا salt إلى كلمات المرور، لكن استخدم BCrypt أو Argon2 لتخزينها، وليس SHA الخام. استخدم مقارنة بزمن ثابت (MessageDigest.isEqual) لمنع هجمات التوقيت.
الأسئلة الشائعة
هل درس «التجزئة التشفيرية باستخدام MessageDigest» مجاني؟
نعم — نص درس «التجزئة التشفيرية باستخدام MessageDigest» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «التجزئة التشفيرية باستخدام MessageDigest»؟
جزّئ كلمات المرور باستخدام SHA-256، وأضف salt لمنع هجمات جداول قوس قزح، وقارن الملخصات بأمان تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «التجزئة التشفيرية باستخدام MessageDigest»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التجزئة التشفيرية باستخدام MessageDigest
- التشفير المتماثل باستخدام AES
- HMAC-SHA256 لضمان سلامة الرسائل
- JWT: البنية والإنشاء والتحقق