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

HMAC ใน API: การลงนามคำขอ

สร้างการลงนามคำขอด้วย HMAC และการป้องกันการโจมตีแบบเล่นซ้ำ

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

ยินดีต้อนรับ

AWS, GitHub, Stripe และ Twilio ใช้การลงนามคำขอโดยอาศัย HMAC เพื่อยืนยันความถูกต้องของการเรียก API ในบทเรียนนี้ เราจะสร้างระบบลงนามคำขอที่สมบูรณ์

เหตุใดจึงต้องลงนามคำขอ API

กุญแจ API ใน URL อาจถูกบันทึกไว้ในเซิร์ฟเวอร์พร็อกซี ประวัติเบราว์เซอร์ และบันทึกของเซิร์ฟเวอร์ การลงนามคำขอจะรวมเนื้อหาคำขอทั้งหมดไว้ใน MAC เพื่อยืนยันว่า payload ไม่ได้ถูกแก้ไข และกุญแจไม่ได้ถูกเปิดเผยโดยลำพัง

AWS Signature Version 4

AWS SigV4 คำนวณค่าต่อไปนี้: 1. คำขอรูปแบบมาตรฐาน (method + URL + headers + ค่าแฮชของ body) 2. สตริงสำหรับลงนาม (date + region + service + ค่าแฮชของคำขอรูปแบบมาตรฐาน) 3. กุญแจสำหรับลงนาม = HMAC(HMAC(HMAC(HMAC('AWS4'+secret, date), region), service), 'aws4_request') 4. ลายเซ็น = HMAC(signing_key, string_to_sign)

การตรวจสอบเว็บฮุกของ GitHub

GitHub ลงนาม payload ของเว็บฮุกแต่ละรายการ: X-Hub-Signature-256: sha256=HMACHEX ตรวจสอบดังนี้: import hmac expected = 'sha256=' + hmac.new(secret, payload, 'sha256').hexdigest() hmac.compare_digest(expected, received_signature)

ภัยคุกคามจากการโจมตีแบบเล่นซ้ำ

หากผู้โจมตีดักจับคำขอที่ลงนามถูกต้องได้ ก็สามารถส่งคำขอนั้นซ้ำหลายครั้งได้ การโอนเงิน 100 ดอลลาร์ที่ลงนามเพียงครั้งเดียวอาจถูกนำมาเล่นซ้ำ 1,000 ครั้ง HMAC เพียงอย่างเดียวไม่สามารถป้องกันการเล่นซ้ำได้

การป้องกันการเล่นซ้ำโดยใช้เวลา

ใส่การประทับเวลาไว้ในข้อความที่ลงนาม ปฏิเสธคำขอที่เก่ากว่า 5 นาที Stripe ส่ง X-Stripe-Signature พร้อมการประทับเวลา ส่วน GitHub ใช้ X-GitHub-Delivery (UUID) ซึ่งไม่ได้อาศัยการประทับเวลา

การป้องกันการเล่นซ้ำโดยใช้ค่า nonce

ใส่ nonce แบบสุ่มในคำขอแต่ละรายการ เซิร์ฟเวอร์จะจัดเก็บ nonce ที่เคยใช้แล้ว (ใน Redis พร้อม TTL) และปฏิเสธคำขอที่มี nonce ที่เคยพบมาก่อน วิธีนี้น่าเชื่อถือกว่าการใช้การประทับเวลาสำหรับระบบแบบกระจาย

การนำการลงนามคำขอไปใช้งาน

import hmac, hashlib, time, os def sign_request(secret, method, path, body, timestamp=None): ts = timestamp or str(int(time.time())) payload = f'{method}\n{path}\n{ts}\n' + hashlib.sha256(body).hexdigest() sig = hmac.new(secret.encode(), payload.encode(), 'sha256').hexdigest() return ts, sig

การตรวจสอบฝั่งเซิร์ฟเวอร์

def verify_request(secret, method, path, body, ts, received_sig): # Check timestamp freshness if abs(time.time() - int(ts)) > 300: # 5 minutes return False # Recompute and compare _, expected = sign_request(secret, method, path, body, ts) return hmac.compare_digest(expected, received_sig)

JWT ที่ใช้ HMAC (HS256)

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

กลยุทธ์การหมุนเวียนกุญแจ

หมุนเวียนกุญแจ HMAC เป็นระยะ โดยสร้างกุญแจใหม่ รองรับทั้งกุญแจเก่าและใหม่ในช่วงเปลี่ยนผ่าน (24 ชั่วโมง) แล้วจึงเลิกใช้กุญแจเก่า AWS SigV4 อนุมานกุญแจจาก secret ที่ผูกกับวันที่ เพื่อให้หมุนเวียนกุญแจได้ทุกวัน

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เหตุใดการลงนามคำขอด้วย HMAC เพียงอย่างเดียวจึงไม่เพียงพอสำหรับป้องกันการโจมตีแบบเล่นซ้ำ

สรุปทบทวน

นำการลงนามคำขอด้วย HMAC พร้อมการป้องกันการเล่นซ้ำไปใช้งานแล้ว ขั้นต่อไป เราจะเปรียบเทียบ CMAC และ Poly1305 ในฐานะทางเลือกของ MAC ที่อาศัยรหัสแบบบล็อก

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

บทเรียน “HMAC ใน API: การลงนามคำขอ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “HMAC ใน API: การลงนามคำขอ”

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

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

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

บทเรียน “HMAC ใน API: การลงนามคำขอ” ใช้เวลานานแค่ไหน

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

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

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

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

  1. แนวคิด MAC และการโจมตีแบบขยายความยาว
  2. โครงสร้าง HMAC และการพิสูจน์ความปลอดภัย
  3. HMAC ใน API: การลงนามคำขอ
  4. CMAC และ Poly1305: MAC ด้วยรหัสเข้ารหัสแบบบล็อก
← กลับไปที่ Cryptology Academy