التشفير في Java: تشفير البيانات والتجزئة
في عالم أمن المعلومات الحديث، يلعب التشفير دورًا رئيسيًا. توفر Java أدوات مدمجة قوية لتنفيذ العمليات التشفيرية من خلال بنية التشفير في Java (JCA) وامتداد التشفير في Java (JCE). في هذه المقالة، سنشرح بالتفصيل الآليات الأساسية: التشفير المتماثل، التشفير غير المتماثل، والتجزئة، بالإضافة إلى تقديم أمثلة عملية على الكود.
المفاهيم الأساسية للتشفير
قبل الانتقال إلى الكود، من المهم فهم الفرق بين البدائيات التشفيرية الأساسية:
- التشفير المتماثل — يستخدم نفس المفتاح لتشفير وفك تشفير البيانات. سريع، لكنه يتطلب نقلًا آمنًا للمفتاح.
- التشفير غير المتماثل — يستخدم زوجًا من المفاتيح: مفتاح عام (للتشفير) ومفتاح خاص (لفك التشفير). أبطأ، لكنه يحل مشكلة تبادل المفاتيح.
- التجزئة — تحويل لا رجعة فيه للبيانات إلى سلسلة ذات طول ثابت. تُستخدم للتحقق من السلامة وتخزين كلمات المرور.
التشفير المتماثل AES في Java
AES (معيار التشفير المتقدم) هو الخوارزمية المتماثلة الأكثر شيوعًا. في Java، يتم التعامل معها من خلال الفئة Cipher. لنلقِ نظرة على مثال لتشفير وفك تشفير سلسلة نصية:
import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;
public class AesExample { public static void main(String[] args) throws Exception { // توليد مفتاح AES-128 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey secretKey = keyGen.generateKey(); // الرسالة الأصلية String originalMessage = "Привет, криптография!"; System.out.println("الرسالة الأصلية: " + originalMessage); // التشفير Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(originalMessage.getBytes("UTF-8")); String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("الرسالة المشفرة: " + encryptedMessage); // فك التشفير cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage)); String decryptedMessage = new String(decryptedBytes, "UTF-8"); System.out.println("الرسالة المفكوكة: " + decryptedMessage); }}في المثال، يتم استخدام وضع ECB (دفتر الشفرات الإلكتروني) مع حشو PKCS5Padding. للإنتاج، يُوصى باستخدام أوضاع أكثر أمانًا مثل CBC أو GCM.
التشفير غير المتماثل RSA
RSA هي الخوارزمية غير المتماثلة الكلاسيكية. في Java، يتم استخدام الفئات KeyPairGenerator و Cipher للتعامل معها. من المهم تذكر: يمكن لـ RSA تشفير البيانات فقط حتى حجم المفتاح (عادةً 2048 بت). للبيانات كبيرة الحجم، يتم دمج RSA مع التشفير المتماثل (نظام هجين).
import javax.crypto.Cipher;import java.security.*;import java.util.Base64;
public class RsaExample { public static void main(String[] args) throws Exception { // توليد زوج مفاتيح RSA-2048 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); String secretMessage = "Секретные данные"; System.out.println("الرسالة الأصلية: " + secretMessage); // التشفير بالمفتاح العا