ตรวจ 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 แบบนี้:
วิธีทำซ้ำด้วยมือ:
- 1. เปิด HMAC generator ใน DevToys แล้วตั้งฟังก์ชันแฮชเป็น
SHA256 - 2. วาง signing secret ลงในช่อง key เป็นข้อความ UTF-8 ล้วน
- 3. ในช่อง input วางให้ตรงเป๊ะ
<timestamp>.<raw_body>— ค่าX-Device-Timestamp, จุด ASCII หนึ่งตัว แล้วตามด้วยไบต์ของ raw body: - 4. เทียบผล hex ตัวพิมพ์เล็กกับ header
X-Device-Signatureตรงทุกไบต์แปลว่า secret, timestamp และ body ตรงกันหมด
เมื่อไร 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 — และเทียบด้วยฟังก์ชันเวลาคงที่เสมอ อย่าใช้ == เด็ดขาด