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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแฮชเชิงเข้ารหัสด้วย MessageDigest
- การเข้ารหัสแบบสมมาตร AES
- HMAC-SHA256 เพื่อความถูกต้องครบถ้วนของข้อความ
- JWT: โครงสร้าง การสร้าง และการตรวจสอบ