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

HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ

สร้างและตรวจสอบลายเซ็น HMAC-SHA256 เพื่อยืนยันความถูกต้องครบถ้วนของข้อมูลที่ส่งผ่าน API

HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

HMAC คืออะไร

HMAC (รหัสยืนยันข้อความที่ใช้แฮช) ผสานฟังก์ชันแฮชเชิงเข้ารหัสเข้ากับคีย์ลับเพื่อสร้าง MAC ซึ่งพิสูจน์ได้ทั้งว่าข้อมูลไม่ถูกแก้ไข และผู้ส่งรู้คีย์ลับ

HMAC เทียบกับแฮชธรรมดา

ทุกคนสามารถคำนวณแฮช SHA-256 ธรรมดาได้ แต่ HMAC ต้องใช้คีย์ลับ จึงมีเพียงฝ่ายที่รู้คีย์เท่านั้นที่สามารถสร้างหรือตรวจสอบ HMAC ที่ถูกต้องได้ แฮชธรรมดาให้ความถูกต้องครบถ้วนของข้อมูล แต่ไม่ให้การยืนยันตัวตน

การคำนวณ HMAC-SHA256 ใน Java

ใช้ Mac.getInstance("HmacSHA256") เริ่มต้นการทำงานด้วย SecretKeySpec แล้วเรียก doFinal(data)

byte[] keyBytes = "my-secret-key".getBytes(StandardCharsets.UTF_8);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(keySpec);
byte[] hmac = mac.doFinal("payload data".getBytes(StandardCharsets.UTF_8));
String hmacHex = HexFormat.of().formatHex(hmac);
System.out.println(hmacHex); // 64-char hex

การตรวจสอบ HMAC

คำนวณ HMAC ใหม่จากข้อมูลที่ได้รับโดยใช้คีย์ร่วม ใช้การเปรียบเทียบโดยใช้เวลาเท่ากันทุกกรณี (MessageDigest.isEqual) เพื่อป้องกันการโจมตีจากเวลา

byte[] expectedHmac = computeHmac(key, receivedPayload);
byte[] actualHmac    = HexFormat.of().parseHex(receivedHmacHex);
boolean valid = MessageDigest.isEqual(expectedHmac, actualHmac);
if (!valid) throw new SecurityException("HMAC verification failed — data tampered!");

การสร้างคีย์ที่ปลอดภัย

คีย์ HMAC ควรเป็นไบต์สุ่ม ไม่ใช่รหัสผ่าน ใช้ KeyGenerator หรือ SecureRandom เพื่อสร้างคีย์ขนาด 256 บิต

KeyGenerator kg = KeyGenerator.getInstance("HmacSHA256");
kg.init(256);
SecretKey key = kg.generateKey();
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());

HMAC สำหรับการลงนามคำขอ API

คำนวณ HMAC จากเมธอด HTTP, พาธ, เวลา และเนื้อหาคำขอ ใส่ HMAC ไว้ในส่วนหัว X-Signature เซิร์ฟเวอร์จะคำนวณใหม่และเปรียบเทียบเพื่อตรวจสอบว่าคำขอไม่ถูกแก้ไข

String payload = method + "\n" + path + "\n" + timestamp + "\n" + body;
byte[] hmac = computeHmac(apiSecretKey, payload);
request.header("X-Signature", "hmac-sha256=" + HexFormat.of().formatHex(hmac));
request.header("X-Timestamp", timestamp);

การป้องกันการโจมตีแบบเล่นซ้ำ

ผู้โจมตีสามารถส่งคำขอที่ลงนามถูกต้องซ้ำได้ ให้ใส่เวลาไว้ในข้อมูลที่ลงนาม และปฏิเสธคำขอที่เก่ากว่าสองสามนาที

long timestamp = Long.parseLong(request.getHeader("X-Timestamp"));
if (Math.abs(System.currentTimeMillis() / 1000 - timestamp) > 300) {
    throw new SecurityException("Request too old — possible replay attack");
}

HMAC สำหรับการตรวจสอบ Webhook

GitHub, Stripe และบริการอีกมากมายลงนาม Webhook ด้วย HMAC โปรดตรวจสอบส่วนหัว X-Hub-Signature-256 เพื่อยืนยันว่า Webhook มาจากบริการดังกล่าวและไม่ได้ถูกแก้ไข

// GitHub webhook verification:
String received = request.getHeader("X-Hub-Signature-256").replace("sha256=","");
byte[] expected = computeHmac(webhookSecret, request.getBody());
boolean valid = MessageDigest.isEqual(expected, HexFormat.of().parseHex(received));

HMAC ใน JWT

HS256 (HMAC-SHA256) เป็นอัลกอริทึมลายเซ็น JWT ที่ใช้กันทั่วไป ส่วนหัวและข้อมูลเนื้อหาจะถูกลงนามด้วยคีย์ลับร่วม ทั้งผู้ออกและผู้ตรวจสอบต้องรู้คีย์ลับ จึงเหมาะสำหรับไมโครเซอร์วิสที่อยู่ในขอบเขตความน่าเชื่อถือเดียวกัน

การหมุนเวียนคีย์ HMAC

หมุนเวียนคีย์ HMAC เป็นระยะ ระหว่างการหมุนเวียน ให้ยอมรับ HMAC จากทั้งคีย์เก่าและคีย์ใหม่ในช่วงเวลาสั้น ๆ ที่คาบเกี่ยวกัน จากนั้นเลิกใช้คีย์เก่า

ควรใช้ HMAC หรือลายเซ็นดิจิทัลเมื่อใด

HMAC: แบบสมมาตร ทั้งสองฝ่ายใช้คีย์ลับร่วมกัน รวดเร็ว เหมาะสำหรับ API ภายในและการตรวจสอบ Webhook ส่วนลายเซ็นดิจิทัล (RSA/ECDSA): แบบอสมมาตร มีเพียงผู้ลงนามที่ถือคีย์ส่วนตัว ทุกคนที่มีคีย์สาธารณะสามารถตรวจสอบได้ เหมาะสำหรับ JWT ในระบบแบบกระจาย

ตรวจสอบอย่างรวดเร็ว

เหตุใดการเปรียบเทียบ HMAC จึงต้องใช้การเทียบค่าโดยใช้เวลาเท่ากันทุกกรณี

สรุปทบทวน

HMAC-SHA256 ให้ความถูกต้องครบถ้วนที่มีการยืนยันตัวตน ซึ่งพิสูจน์ทั้งแหล่งที่มาของข้อมูลและการไม่ถูกแก้ไข ใช้ Mac.getInstance("HmacSHA256") และใช้การเปรียบเทียบโดยใช้เวลาเท่ากันทุกกรณีเสมอ ใส่เวลาเพื่อป้องกันการโจมตีแบบเล่นซ้ำ ใช้ HMAC สำหรับการลงนาม API การตรวจสอบ Webhook และ JWT แบบ HS256

คำถามที่พบบ่อย

บทเรียน “HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ”

สร้างและตรวจสอบลายเซ็น HMAC-SHA256 เพื่อยืนยันความถูกต้องครบถ้วนของข้อมูลที่ส่งผ่าน API คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ” ใช้เวลานานแค่ไหน

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

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

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

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

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