التشفير في Java: التشفير والتجزئة – دليل عملي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التشفير في Java: التشفير والتجزئة – دليل كامل



التشفير هو الأساس الأمني للتطبيقات الحديثة. في Java، توجد بنية تحتية قوية ومرنة للعمل مع التشفير والتجزئة — Java Cryptography Architecture (JCA) و Java Cryptography Extension (JCE). تتيح هذه المكتبات تنفيذ كل من التشفير المتماثل (AES) وغير المتماثل (RSA)، بالإضافة إلى التجزئة التشفيرية (SHA-256). في هذه المقالة، سنشرح المفاهيم الأساسية ونكتب أمثلة عملية بلغة Java نقية (بدون تبعيات خارجية).



المفاهيم الأساسية وبنية JCA/JCE

توفر JCA إطارًا للعمل مع العمليات التشفيرية. الفكرة الرئيسية هي المزودون (providers)، الذين ينفذون خوارزميات محددة. بشكل افتراضي، يتضمن JDK المزود SUN (للتجزئة) و SunJCE (للتشفير). توجد الفئات الرئيسية في الحزمة javax.crypto و java.security.

  • Cipher — الفئة الرئيسية للتشفير وفك التشفير.
  • KeyGenerator — توليد المفاتيح المتماثلة.
  • KeyPairGenerator — توليد أزواج المفاتيح للتشفير غير المتماثل.
  • MessageDigest — حساب قيم التجزئة.
  • SecretKeySpec — تمثيل مفتاح متماثل من مصفوفة بايت.


التشفير المتماثل: AES

AES (Advanced Encryption Standard) هو أشهر خوارزمية تشفير متماثل. يستخدم نفس المفتاح للتشفير وفك التشفير. الوضع الموصى به هو GCM (تشفير موثق) أو CBC مع PKCS5Padding. فيما يلي مثال لتشفير سلسلة باستخدام AES-256/GCM.



import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.GCMParameterSpec;import java.security.SecureRandom;import java.util.Base64;

public class AESGCMExample { private static final int AES_KEY_SIZE = 256; private static final int GCM_IV_LENGTH = 12; private static final int GCM_TAG_LENGTH = 128;

public static SecretKey generateKey() throws Exception { KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(AES_KEY_SIZE, SecureRandom.getInstanceStrong()); return keyGen.generateKey(); }

public static String encrypt(String plaintext, SecretKey key) throws Exception { byte[] iv = new byte[GCM_IV_LENGTH]; SecureRandom.getInstanceStrong().nextBytes(iv); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.ENCRYPT_MODE, key, spec); byte[] cipherText = cipher.doFinal(plaintext.getBytes()); byte[] encrypted = new byte[iv.length + cipherText.length]; System.arraycopy(iv, 0, encrypted, 0, iv.length); System.arraycopy(cipherText, 0, encrypted, iv.length, cipherText.length); return Base64.getEncoder().encodeToString(encrypted); }

public static String decrypt(String encryptedData, SecretKey key) throws Exception { byte[] decoded = Base64.getDecoder().decode(encryptedData); byte[] iv = new byte[GCM_IV_LENGTH]; System.arraycopy(decoded, 0, iv, 0, iv.length); byte[] cipherText = new byte[decoded.length - iv.length]; System.arraycopy(decoded, iv.length, cipherText, 0, cipherText.length); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.DECRYPT_MODE, key, spec); return new String(cipher.doFinal(cipherText)); }

public static void main(String[] args) throws Exception { SecretKey key = generateKey()

توصيات