← 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.

Câu hỏi thường gặp

Làm sao để xác minh chữ ký webhook UnifyPort thủ công?
Trong CyberChef, thêm HMAC (Hashing function SHA256, signing secret làm Key với encoding UTF8) rồi đến To Hex (delimiter để trống, bytes per line 0). Dán đúng <timestamp>.<raw_body> vào pane Input. Output phải khớp từng byte với header X-Device-Signature.
Tại sao chữ ký của tôi không khớp với cái UnifyPort gửi?
Ba nguyên nhân thường gặp: (1) bạn dùng sai signing secret — xác nhận giá trị khớp với cái bạn thấy trong dashboard; (2) body bị sửa trước khi xác minh — JSON được re-emit, xoá khoảng trắng, hay chuẩn hoá unicode đều làm hỏng digest; (3) timestamp được đọc từ sai header — chỉ X-Device-Timestamp được ký, không phải header Date của framework.
Dán signing secret vào CyberChef có an toàn không?
Bản CyberChef host chính thức là bundle tĩnh phía client — secret không bao giờ rời khỏi trình duyệt của bạn, và không có logging phía server. Nếu vẫn muốn hoàn toàn không lộ, clone repository và mở index.html tại local, hoặc dùng DevToys — bản desktop hoàn toàn offline tương đương.

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ờ ==.