← Tất cả công cụ
Ghi chú của chúng tôi

Xác minh X-Device-Signature thủ công với CyberChef

Khi chữ ký webhook không khớp, việc đầu tiên là xác định phía nào trong so sánh đang sai — phía bạn hay phía chúng tôi. CyberChef cho phép bạn chạy đúng thuật toán ký của UnifyPort ngay trên trình duyệt, với cùng input mà handler đang thấy, trong khoảng 30 giây.

UnifyPort thực sự ký cái gì

Mỗi delivery có cấu hình signing secret đều mang theo ba header:

X-Device-Delivery-Id: d_01J2K…
X-Device-Timestamp: 1716800000
X-Device-Signature: 9f8c…

Chữ ký được tính như sau:

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

Vài điểm đáng dán cạnh màn hình trước khi debug:

  • Ký tự giữa timestamp và body là dấu chấm ASCII (.), không phải xuống dòng.
  • raw_body là byte chúng tôi gửi — trước khi bạn parse JSON, xoá khoảng trắng, hay chuẩn hoá unicode.
  • Output hex là chữ thường. Nếu so sánh với digest viết hoa, bạn sẽ false-negative.

Recipe CyberChef

Trong CyberChef, kéo hai operation sau vào pane recipe theo đúng thứ tự:

  1. 1. HMAC — đặt Hashing function thành SHA256. Dán signing secret vào ô Key, Type chọn UTF8.
  2. 2. To HexDelimiter để trống, Bytes per line0. Sẽ ra chuỗi hex chữ thường không có khoảng trắng, khớp với header.

Trong pane Input, dán đúng <timestamp>.<raw_body> — ví dụ:

1716800000.{"id":"evt_demo","type":"message.received",...}

Output phải khớp với X-Device-Signature trong delivery. Nếu không khớp, bug nằm ở một trong ba chỗ: dùng sai secret, body bị sửa trên đường đi, hoặc bạn đọc timestamp từ sai header.

Khi việc check thủ công này thực sự đáng giá

  • Sau khi xoay signing secret. Xác nhận secret mới đến handler trước khi đổ lỗi cho DNS hoặc deploy cũ.
  • Sau khi upgrade thư viện JSON. Một số parser re-emit body trước khi đưa cho validator — dễ bỏ sót đến khi chữ ký đột nhiên sai.
  • Khi đồng nghiệp nói "máy tôi chạy được". Cả hai cùng chạy recipe và input giống nhau; ai ra digest khác là người đang giữ sai secret.

Về việc dán secret vào trang web

CyberChef là bundle tĩnh phía client — chạy hoàn toàn trong trình duyệt, và bản host chính thức không gửi secret rời khỏi máy bạn. Nếu vẫn lo extension trình duyệt hoặc session dùng chung, chạy CyberChef local (clone repo, mở index.html) hoặc dùng DevToys — bản desktop hoàn toàn offline tương đương. Để xoay secret production, hãy so sánh bằng code với hàm constant-time, không nhìn bằng mắt vào output CyberChef.

Sau khi đã verify thủ công

Đưa logic tương đương vào handler. Hầu hết ngôn ngữ đã có primitive trong thư viện chuẩn: crypto.createHmac trong Node, hmac.new trong Python, hmac.New trong Go. Luôn so sánh bằng hàm constant-time (timingSafeEqual, hmac.compare_digest, hmac.Equal) — không bao giờ ==.