محافظت از امنیت API
در سرویسهای API، X-Timestamp، X-Nonce، X-AccessKey و X-Signature اجزای اصلی رایج مکانیسمهای امضای درخواست API هستند که در درجه اول برای احراز هویت، تایید یکپارچگی داده و جلوگیری از حملات تکراری استفاده میشوند.
تجزیه و تحلیل اجزای اصلی
1. X-Timestamp (زماننشانی)
کارکردها
- زمان شروع درخواست را记録 میکند (معمولاً timestamp یونیکس) برای اعتبارسنجی及时性 درخواست در سمت سرور.
مشکلات حل شده
- جلوگیری از حملات تکراری: سرور یک دوره اعتبار timestamp تعیین میکند (مثلاً 5 دقیقه)، و مستقیماً درخواستهای منقضی شده را رد میکند. مهاجمان نمیتوانند درخواستهای مشروع معتبر را پس از منقضی شدن تکرار کنند.
- بررسی همزمانی: از انحراف زمانی بین کلاینت و سرور در یک محدوده معقول اطمینان میدهد، و از تأثیر دستکاری زمان بر اعتبار درخواست جلوگیری میکند.
2. X-Nonce (عدد تصادفی یکبار مصرف)
کارکردها
- رشته تصادفی منحصر به فرد تولید میکند (مثلاً UUID) تا یکتایی هر درخواست را تضمین کند.
مشکلات حل شده
- جلوگیری از درخواستهای تکراری: سرور مقادیر Nonce را کش میکند (یا با timestamp ترکیب میکند) تا درخواستهای تکراری که قبلاً پردازش شدهاند را رد کند.
- افزایش پویایی امضا: حتی برای درخواستهای با پارامترهای یکسان، نتیجه امضا به دلیل Nonceهای مختلف متفاوت است، که از استفاده مجدد امضا جلوگیری میکند.
3. X-AccessKey (کلید دسترسی)
کارکردها
- هویت کلاینت را شناسایی میکند (مثلاً کاربر، برنامه یا سرویس)، که معمولاً با
SecretKeyتعریف شده توسط سرور جفت میشود.
مشکلات حل شده
- احراز هویت: بررسی میکند که آیا درخواستدهنده یک کلاینت قانونی ثبت شده است.
4. X-Signature (امضا درخواست)
کارکردها
- کلاینت از
SecretKeyبرای تولید امضا برای محتویات درخواست (پارامترها، مسیر، timestamp، Nonce و غیره) استفاده میکند، و سرور با استفاده از همان الگوریتم امضا را تأیید میکند.
مشکلات حل شده
- یکپارچگی داده: تضمین میکند که درخواست در طول انتقال دستکاری نشده باشد (تغییرات پارامتر باعث شکست تأیید امضا خواهد شد).
- جلوگیری از جعل هویت: مهاجمان بدون
SecretKeyنمیتوانند امضا صحیح تولید کنند و نمیتوانند درخواستهای معتبر جعل کنند. - پیوند پارامترهای کلیدی: الگوریتمهای امضا معمولاً شامل روشهای درخواست، مسیرها، پارامترها و غیره هستند، که یکپارچگی بین محتویات درخواست و امضا را تضمین میکنند.
مثال فرآیند کلی
مراحل تولید امضا کلاینت
- دادههای درخواست را ترکیب کنید
- از
SecretKeyبرای تولید امضا از طریق الگوریتم رمزگذاری استفاده کنید و آن را در هدرX-Signatureذخیره کنید. X-Timestamp،X-Nonce،X-AccessKeyوX-Signatureرا به هدرهای درخواست اضافه کنید و ارسال کنید.
فرآیند تأیید سمت سرور
- تأیید Timestamp: بررسی کنید که آیا در دوره اعتبار است (مثلاً ±5 دقیقه).
- تأیید Nonce: بررسی کنید که آیا قبلاً وجود دارد (برای جلوگیری از درخواستهای تکراری، میتواند با timestamp کش شود).
- تأیید Signature:
SecretKeyمربوطه را از طریقAccessKeyپیدا کنید، امضا را با همان الگوریتم تولید کنید، و آن را باX-Signatureمقایسه کنید. - پردازش نتیجه: اگر تمام تأییدها بروز کنند، منطق درخواست را اجرا کنید؛ در غیر این صورت، خطاهای 401 Unauthorized یا 403 Forbidden را بازگردانید.
خلاصه مزایای مکانیسم
| کارکرد | روش پیادهسازی |
|---|---|
| احراز هویت | AccessKey هویت کلاینت را شناسایی میکند، Signature تایید میکند که کلاینت دارای SecretKey معتبر است. |
| اقاوم در برابر دستکاری داده | امضا با محتویات درخواست (روش، مسیر، پارامترها و غیره) پیوند میکند، هر تغییری باعث شکست تأیید امضا خواهد شد. |
| جلوگیری از حملات تکراری | Timestamp及时性 را تضمین میکند، Nonce یکتایی درخواست را تضمین میکند، مکانیسمهای دوگانه درخواستهای تکراری/منقضی شده را رد میکنند. |
| عدم انکار | امضا میتواند منشأ درخواست را ردیابی کند، کلاینتها نمیتوانند از شروع درخواستهای معتبر انکار کنند. |