فنی · پاسخ مستند
تأیید امضای وبهوک
تأیید امضای وبهوک یک فرایند امنیتی است که در آن گیرنده، امضای رمزنگاریشده پیوستشده به یک درخواست HTTP ورودی را اعتبارسنجی میکند. این کار تضمین میکند payload توسط ارائهدهنده مورداعتماد ارسال شده و در طول انتقال تغییر نکرده است.
تعریف
تأیید امضای وبهوک سازوکاری برای احراز هویت منبع یک رویداد وبهوک است. وقتی ارائهدهندهای مانند Resend یا SendGrid اعلانی درباره یک رویداد ایمیل ارسال میکند، هشی از payload را که با یک کلید مخفی امضا شده همراه آن میفرستد. سرور گیرنده با همان کلید مخفی هش را دوباره محاسبه میکند و آن را با امضای ارائهشده در هدر درخواست مقایسه میکند.
فرایند فنی
ارائهدهنده با استفاده از یک secret مشترک و بدنه درخواست، یک هش HMAC تولید میکند. این هش در یک هدر ارسال میشود که اغلب X-Signature یا نامی مشابه دارد. گیرنده بدنه خام درخواست و هدر امضا را دریافت میکند. سپس گیرنده با استفاده از secret مشترک، هش HMAC خود را محاسبه میکند. اگر هش محاسبهشده با مقدار هدر مطابقت داشته باشد، درخواست معتبر است. اگر متفاوت باشند، درخواست بهعنوان غیرمجاز رد میشود.
اهمیت برای فرستندگان
بدون تأیید امضا، هر کسی که URL وبهوک شما را بداند میتواند داده جعلی به سرور شما بفرستد. این میتواند به بهروزرسانیهای نادرست پایگاه داده منجر شود، مثلاً ایمیلی که تحویل شده برگشتخورده علامت بخورد. پیادهسازی تأیید امضا جلوی حملات جعل را میگیرد و تضمین میکند برنامه شما فقط به رویدادهای معتبری که زیرساخت ایمیل شما ایجاد کرده واکنش نشان دهد.
نکات عملیاتی
یک اشتباه رایج، parse کردن بدنه درخواست به یک شیء JSON پیش از تأیید امضاست. چون parserهای JSON ممکن است فاصلهگذاری یا ترتیب کلیدها را تغییر دهند، رشته حاصل ممکن است با payload اصلی که ارائهدهنده استفاده کرده مطابقت نداشته باشد. برای جلوگیری از شکست تأیید، همیشه از بدنه خام و parseنشده درخواست برای محاسبه HMAC استفاده کنید.
نمونه پیادهسازی
در محیط Node.js، توسعهدهنده از ماژول crypto استفاده میکند تا با secret ارائهدهنده یک هش hmac sha256 از بدنه خام بسازد. سپس این نتیجه با یک تابع مقایسه با زمان ثابت (constant-time) با هدر امضا مقایسه میشود تا از حملات زمانسنجی (timing attack) جلوگیری شود. SendHQ ابزارهای رایگانی در https://sendhq.cc/tools ارائه میدهد که به مدیریت پیکربندیهای مختلف ایمیل کمک میکنند؛ پیکربندیهایی که اغلب پیش از راهاندازی وبهوک لازماند.
پرسشهایی که تیمها میپرسند
اگر کلید مخفی لو برود چه میشود؟
اگر کلید مخفی افشا شود، مهاجم میتواند درخواستهای جعلی را امضا کند که سرور شما آنها را معتبر میپذیرد. باید فوراً کلید مخفی را در داشبورد ارائهدهنده عوض کنید و متغیرهای محیطی سرور خود را بهروز کنید.
آیا HTTPS نیاز به تأیید امضا را از بین میبرد؟
خیر. HTTPS دادهها را در طول انتقال رمزگذاری میکند و هویت سرور را تأیید میکند، اما تأیید نمیکند کلاینتی که درخواست را ارسال میکند همان ارائهدهنده ایمیل مجاز شماست.
چرا بهجای یک کلید API ساده از HMAC استفاده کنیم؟
امضاهای HMAC ثابت میکنند محتوای پیام دستکاری نشده است. یک کلید API ثابت در هدر فقط ثابت میکند فرستنده کلید را میداند، نه اینکه payload دستنخورده است.
منابع اصلی
- مستندات Resend — Resend
- مستندات توسعهدهندگان Postmark — Postmark
- مستندات SendGrid — Twilio SendGrid