← เครื่องมือทั้งหมด
บันทึกของเรา

ตรวจ X-Device-Signature แบบออฟไลน์ด้วย DevToys

บางครั้งคุณอยากตรวจลายเซ็น webhook โดยไม่ต้องเอา signing secret ไปวางในเว็บไซต์ใด ๆ DevToys เป็นกล่องเครื่องมือเดสก์ท็อปที่ทำงานออฟไลน์ทั้งหมด — secret ไม่เคยออกจากเครื่องของคุณ

DevToys คืออะไร

DevToys เป็น "มีดพับสวิสสำหรับนักพัฒนา" แบบออฟไลน์ — แอปเดสก์ท็อปที่รวม generator, converter และ encoder ที่ไม่อย่างนั้นคุณต้องเปิดเว็บทูลเป็นสิบ ตัวที่เราสนใจตรงนี้คือ HMAC generator ของมัน

ทำไมออฟไลน์จึงสำคัญกับ signing secret

ลายเซ็น webhook ของ UnifyPort คือ HMAC ที่ใช้ signing_secret ของคุณเป็นกุญแจ เครื่องมือแฮชบนเว็บสะดวกก็จริง แต่ให้คุณวาง secret นั้นลงในหน้าเว็บ DevToys คำนวณทุกอย่างในเครื่อง — ไม่ส่งอะไรออกไปที่ไหน — จึงปลอดภัยกว่าเมื่อ secret เป็นตัวที่คุณใช้จริง

ตรวจ X-Device-Signature ใน DevToys

UnifyPort เซ็นแต่ละ delivery แบบนี้:

X-Device-Signature = hex( HMAC-SHA256( secret, timestamp + "." + raw_body ) )

วิธีทำซ้ำด้วยมือ:

  1. 1. เปิด HMAC generator ใน DevToys แล้วตั้งฟังก์ชันแฮชเป็น SHA256
  2. 2. วาง signing secret ลงในช่อง key เป็นข้อความ UTF-8 ล้วน
  3. 3. ในช่อง input วางให้ตรงเป๊ะ <timestamp>.<raw_body> — ค่า X-Device-Timestamp, จุด ASCII หนึ่งตัว แล้วตามด้วยไบต์ของ raw body:
  4. 4. เทียบผล hex ตัวพิมพ์เล็กกับ header X-Device-Signature ตรงทุกไบต์แปลว่า secret, timestamp และ body ตรงกันหมด
1716800000.{"type":"message.received", … }

เมื่อไร CyberChef หรือโค้ดเป็นตัวเลือกที่ดีกว่า

  • CyberChef ถ้าอยากต่อหลายขั้นใน recipe เดียว — base64-decode body แล้วค่อย HMAC — คู่มือ CyberChef ของเรายืดหยุ่นกว่า แลกกับการต้องวางลงหน้าเว็บ
  • ในโค้ด อะไรที่ทำซ้ำ ให้ตรวจใน handler ด้วยการเทียบแบบเวลาคงที่ (timingSafeEqual, hmac.compare_digest, hmac.Equal) — อย่าใช้ == เด็ดขาด

เอา input มาจากไหน

  • จะเอา X-Device-Timestamp และ raw body มาป้อน ให้จับ delivery ด้วย webhook.site หรือส่งต่อหนึ่งรายการไป localhost ด้วย smee.io
  • ชอบเบราว์เซอร์และความสะดวกของ recipe ที่แชร์ได้? คู่มือ CyberChef รันอัลกอริทึมเดียวกัน

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

DevToys รันบนแพลตฟอร์มใดบ้าง?
DevToys เป็นแอปเดสก์ท็อปออฟไลน์สำหรับ Windows และ macOS ใช้มันเมื่อคุณไม่อยากวาง signing secret ลงในเว็บฟอร์ม
ทำไม DevToys ปลอดภัยกว่าเครื่องมือ HMAC บนเว็บ?
มันทำงานในเครื่องคุณทั้งหมด — signing secret ที่คุณพิมพ์ไม่เคยถูกส่งไปเซิร์ฟเวอร์ เครื่องมือเว็บอาจเป็น client-side เหมือนกัน แต่กับแอปเดสก์ท็อปคุณไม่ต้องเชื่อแบบไม่มีหลักฐาน
ลายเซ็นที่ฉันคำนวณไม่ตรงกับ X-Device-Signature — ผิดตรงไหน?
สาเหตุที่พบบ่อยสามอย่าง: signing secret ผิด; body ถูกแก้ก่อนแฮช (JSON ถูก serialize ใหม่, ตัดช่องว่าง, normalize unicode); หรืออ่าน timestamp ผิด header — มีแต่ X-Device-Timestamp เท่านั้นที่ถูกเซ็น input ต้องเป็น <timestamp>.<raw_body> เป๊ะ ๆ โดยมีจุดจริงคั่น

พอมันตรงแล้ว

ย้ายการคำนวณเดียวกันเข้าไปใน handler — Node ใช้ crypto.createHmac, Python ใช้ hmac.new, Go ใช้ hmac.New — และเทียบด้วยฟังก์ชันเวลาคงที่เสมอ อย่าใช้ == เด็ดขาด