0Pricing
Java Academy · درس

التشفير المتماثل باستخدام AES

شفّر البيانات الحساسة وفك تشفيرها باستخدام AES/CBC/PKCS5Padding عبر واجهة Java's javax.crypto

التشفير المتماثل باستخدام AES درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

التشفير المتماثل مقابل غير المتماثل

يستخدم التشفير المتماثل المفتاح نفسه للتشفير وفك التشفير (وهو سريع ومناسب للبيانات الكبيرة). أما التشفير غير المتماثل فيستخدم زوجًا من المفاتيح العامة والخاصة (وهو أبطأ ويُستخدم لتبادل المفاتيح والتوقيعات). وتُعد AES خوارزمية التشفير المتماثل القياسية.

أوضاع AES:‏ CBC مقابل GCM

تتضمن AES عدة أوضاع. يُعد AES/CBC/PKCS5Padding شائعًا، لكنه يفتقر إلى المصادقة. أما AES/GCM/NoPadding فيوفر التشفير والمصادقة معًا (AEAD)، ولذلك يُفضَّل بشدة في الشيفرة الجديدة.

إنشاء مفتاح AES

استخدم KeyGenerator لإنشاء مفتاح AES بطول 256 بت بأمان.

KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256); // 256-bit key
SecretKey key = kg.generateKey();
// Persist the key:
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());
// Restore the key:
byte[] decoded = Base64.getDecoder().decode(b64Key);
SecretKey restored = new SecretKeySpec(decoded, "AES");

تشفير AES/GCM

يتطلب وضع GCM متجه تهيئة (IV) فريدًا بطول 12 بايت لكل عملية تشفير. أنشئ IV عشوائيًا جديدًا لكل عملية تشفير، ولا تعِد استخدام IV مع المفتاح نفسه مطلقًا.

byte[] iv = new byte[12]; // 96-bit IV for GCM
new SecureRandom().nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(128, iv); // 128-bit auth tag
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
// Transmit/store: IV + ciphertext (IV is not secret)

فك تشفير AES/GCM

استخرج IV من البيانات المخزنة، وأعد إنشاء المواصفة، ثم فك التشفير. يتحقق GCM تلقائيًا من الأصالة؛ إذ تؤدي البيانات التي جرى العبث بها إلى طرح AEADBadTagException.

// Assume stored = iv + ciphertext:
byte[] iv         = Arrays.copyOfRange(stored, 0, 12);
byte[] ciphertext = Arrays.copyOfRange(stored, 12, stored.length);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] plaintext = cipher.doFinal(ciphertext); // throws if tampered

تخزين IV مع النص المشفّر

لا يُعد IV سرّيًا، لذا خزّنه مسبوقًا بالنص المشفّر أو إلى جانبه. يحتاج الطرف المستلم إلى IV لفك التشفير. أما المفتاح فيجب الحفاظ على سريته.

byte[] encryptedData = new byte[iv.length + ciphertext.length];
System.arraycopy(iv,         0, encryptedData, 0,          iv.length);
System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length);
String b64 = Base64.getEncoder().encodeToString(encryptedData);

اشتقاق المفتاح من كلمة المرور (PBKDF2)

لا تستخدم كلمة المرور مباشرةً كمفتاح AES، إذ إن مقدار العشوائية فيها منخفض جدًا. اشتق مفتاحًا باستخدام PBKDF2 مع salt عشوائي وعدد كبير من التكرارات.

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310_000, 256);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] keyBytes = skf.generateSecret(spec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");

استخدام موفّر أمان Java

يتولى الموفّر الافتراضي في JDK التعامل مع AES. أما الخوارزميات الإضافية أو الامتثال لمعيار FIPS، فاستخدم موفّر Bouncy Castle.

// With Bouncy Castle:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");

نمط تشفير الغلاف

شفّر البيانات باستخدام مفتاح تشفير بيانات (DEK) مُنشأ عشوائيًا. ثم شفّر DEK باستخدام مفتاح تشفير مفاتيح (KEK) مخزّن في KMS (مثل AWS KMS أو HashiCorp Vault). يحد هذا من انكشاف المفاتيح.

‏AES في تطبيقات Spring

يوفر TextEncryptor في Spring Security أو وحدة Spring Security Crypto تشفير AES عالي المستوى من دون إدارة Cipher/IV يدويًا.

TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("sensitive data");
String decrypted = encryptor.decrypt(encrypted);

الأخطاء الشائعة

لا تفعل مطلقًا ما يلي: إعادة استخدام IV مع المفتاح نفسه، أو استخدام وضع ECB (إذ تُحافَظ على الأنماط)، أو استخدام كلمة مرور كمفتاح مباشرةً، أو تجاهل وسم المصادقة. استخدم GCM دائمًا في الشيفرة الجديدة.

تحقق سريع

ما الذي يوفره AES/GCM ولا يوفره AES/CBC؟

مراجعة

استخدم AES/GCM/NoPadding للتشفير الموثّق. أنشئ IV عشوائيًا جديدًا بطول 12 بايت لكل عملية تشفير. أضف IV في بداية النص المشفّر. اشتق المفاتيح من كلمات المرور باستخدام PBKDF2. لا تعِد استخدام IV مع المفتاح نفسه مطلقًا.

الأسئلة الشائعة

هل درس «التشفير المتماثل باستخدام AES» مجاني؟

نعم — نص درس «التشفير المتماثل باستخدام AES» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «التشفير المتماثل باستخدام AES»؟

شفّر البيانات الحساسة وفك تشفيرها باستخدام AES/CBC/PKCS5Padding عبر واجهة Java's javax.crypto تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «التشفير المتماثل باستخدام AES»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التجزئة التشفيرية باستخدام MessageDigest
  2. التشفير المتماثل باستخدام AES
  3. ‏HMAC-SHA256 لضمان سلامة الرسائل
  4. ‏JWT: البنية والإنشاء والتحقق
← العودة إلى Java Academy