0Pricing
Java Academy · บทเรียน

การเข้ารหัสแบบสมมาตร AES

เข้ารหัสและถอดรหัสข้อมูลสำคัญด้วย AES/CBC/PKCS5Padding โดยใช้ API javax.crypto ของ Java

การเข้ารหัสแบบสมมาตร AES เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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 โดยใช้ซอลต์สุ่มและจำนวนรอบที่สูง

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 ให้ใช้ผู้ให้บริการ BouncyCastleProvider

// 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” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเข้ารหัสแบบสมมาตร AES”

เข้ารหัสและถอดรหัสข้อมูลสำคัญด้วย AES/CBC/PKCS5Padding โดยใช้ API javax.crypto ของ Java คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเข้ารหัสแบบสมมาตร AES” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแฮชเชิงเข้ารหัสด้วย MessageDigest
  2. การเข้ารหัสแบบสมมาตร AES
  3. HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ
  4. JWT: โครงสร้าง การสร้าง และการตรวจสอบ
← กลับไปที่ Java Academy