مدیریت کلید – یک کلید API مخفی با یک نمک تصادفی به جای ارسال آن به تنهایی در REST API

بگو، من یک نقطه پایانی API HTTPS دارم که تنها توسط مدیر من استفاده می شود.
در هر یک از درخواستها یک کلید API مخفی برای احراز هویت ارسال می کنم. و من با این راه حل خوب هستم

   curl -x PUT .......
  - Header "X-My-Secret-Api-Key $ my_secret_key"
  .....

در بدن من شناسه کاربر و ایمیل را به عنوان بارنامه ارسال می کنم.

آیا آن را امن تر خواهد بود اگر من hash $ my_secret_key با ایمیل کاربر؟

   curl -x PUT .......
  - Header "X-My-Secret-Api-Key SHA-256 ($ {user_email} $ {my_secret_key}}"
  .....

این ایده این است که حتی اگر "X-My-Secret-Api-Key" متوقف شود، یک مهاجم تنها تنها کلید را برای آن کاربر خاص دریافت می کند.
و قادر خواهد بود درخواست های مهمی را فقط از طرف این کاربر ارسال کند و هیچ کس دیگری.

و برای اینکه قادر به ارسال درخواست از طرف کاربر دیگری باشد، مهاجم باید سعی کند "X-My-Secret-Api-Key" را برای آن کاربر نیز دستگیر کند. و غیره.

آیا این بهبود امنیتی مناسب است؟ هر کدوم آیا این روش شناخته شده است؟

آیا در این تنظیم نیاز به حفاظت از CSRF با یک API REST با پشتیبانی oauth2 و یک سرور معتبر SSO Auth SSO دارم؟

من دیدم پاسخ آیا CSRF امکان پذیر است اگر من حتی از کوکی ها استفاده نمی کنم؟ اما 2 پاسخ متقابل وجود دارد و خود سوال این اطلاعات را نیز ارائه نمی دهد.

من یک API REST ایجاد می کنم که توسط یک سرویس دهنده وب (از ایجاد خود ما) در حال اجرا در دامنه دیگری استفاده می شود، بنابراین ما درخواست CORS را انجام دهید این API به عنوان یک سرور منبع oauth2 اجرا می شود، بنابراین دسترسی توسط توالی هایی که در هدر احراز هویت منتقل می شوند محدود شده است. ما هیچ کوکی وجود ندارد، همه چیز بی ثمر است. من از مقاله در https://spring.io/blog/2011/11/30/cross-site-request-forgery-and-oauth2

  • دنبال میکنم. ما از SSL استفاده خواهیم کرد
  • ثبت نام تغییر مسیر uri
  • تنها نوع اعطاء ما، کد مجوز است، بدون نیاز به یک مخفی مشتری (به عنوان منبع مشتری وب عمومی) به جای نوع کمک ضمنی، به عنوان در مورد توصیه های در https://oauth.net/2/ grant-types / implicit /
  • مشتری با یک سرصفحه تایید می کند زمانی که سرور سرور واقعی آن را فراخوانی می کند
  • دریافت پروانه دسترسی توسط گذراندن کد مجوز 1 بار در پارامترهای فرم صورت می گیرد ( x-www- Form-urlencoded )، که به نظر می رسد راه طبیعی است، نباید در تاریخ مرورگر به عنوان پارامتر query باشد.
  • مشتری همچنین از برخی از پارامترهای حالت مخفی هنگام استفاده از کد مجوز استفاده می کند. در این مورد من مطمئن نیستم که یک نقطه وجود دارد زیرا مشتری به یک رمز محرمانه برای دسترسی به یک نشانه دسترسی دسترسی پیدا نمی کند.
  • برای نقطه پایانی oauth / token که در واقع شما یک token دسترسی دریافت می کنید، تنها مجاز هسته دامنه مشتری وب ما است
  • برای نقطه پایانی oauth / authorize CORS مجاز نیست. شاید این بیش از حد باشد زیرا تغییر مسیر یوری فقط به حوزه ی خود ما اشاره می کند؟

من فکر می کنم که تقریبا همه چیز را در آن قسمت پوشش می دهد.

اکنون یک بردار حمله دیگر وجود دارد که در قالب سرور تأیید هویت oauth2 وجود دارد خود، که قرار است SSO باشد و جلسات داشته باشد و با مجوز اولیه در دسترس است. با این حال، به نظر نمی رسد هیچ اقدامی را که می توانید با یک حمله csrf انجام دهید که در واقع مفید خواهد بود. شما می توانید درخواست خود را به این نقطه های oauth انجام دهید، اما شما باید قادر به خواندن نتیجه، که توسط پیکربندی CORS جلوگیری می کند و این واقعیت است که تغییر مسیر uri از قبل ثبت شده است. هیچ POST شما وجود ندارد که بتوانید رمز عبور خود را عوض کنید، آدرس ایمیل خود را بازنشانی کنید، و غیره، همه چیز در واقع به عنوان یک سرور منبع نیز در معرض قرار دارد.

آیا چیزی از دست رفته؟ چگونه می توان در مورد جستجوی آسیب پذیری ها در اینجا جستجو کرد؟

jwt – برنامه ی وب یک درخواست برای یک API REST زمانی که در حال تأیید صحت است

من تازه به ASP.NET هسته و OpenID اتصال / AzureAD، بنابراین من به دنبال برخی از اعتبار سنجی (و یا در غیر اینصورت) از رویکرد من است. خواندن / گوگلینگ گسترده در طول چند هفته گذشته در حالی که من در حال یادگیری این است که پاسخ دقیق نگرفته است (اگر چه بسیاری از تقریبا نادرست است)

من یک برنامه وب مبتنی بر مرورگر است که باید با آن امن AzureAD، به طوری که انتظار می رود، از این استفاده می کند. همه کارها خوب است.

همچنین یک API را در همان نرم افزار قرار می دهم. من نمیخواهم به علت نگرانی CSRF از کوکی استفاده کنم و نیاز به API برای سرویس دهی یک برنامه تلفن همراه در تاریخ بعدی است. من API را برای استفاده از JWT Bearer مبتنی بر auth پیکربندی کردم. همچنین به خوبی کار میکند (به عنوان مثال از پستمن درخواست میکند)

یکی از صفحات در برنامه وب نیاز به برقراری تماس AJAX به API دارد، و من نمیخواهم / باید برنامه را به یک SPA تبدیل کنم. بنابراین رویکردی که در حال حاضر در حال تلاش هستم این است:

وقتی وارد برنامه میشوم، حافظه (از طرف سرور) را از AzureAD دریافت میکنم. وقتی صفحه با تماس AJAX بازدید می شود، من "id_token" را به یک فیلد پنهان می نویسم و ​​هنگامی که نیاز به برقراری تماس AJAX دارم، خواندن id_token در جاوا اسکریپت و اضافه کردن آن به عنوان "مجوز" هدر.

این همه به عنوان یک رویا کار می کند، بنابراین من آن را نگران کرده ام و آن را نگران کرده ام. من نمی توانم مسائل CSRF را ببینم، چون تماس AJAX دیگر کوکی نیست. اگر چه من یک id_token را به صفحه می نویسم، کاربر باید کوکی ها را برای دیدن این صفحه در اولویت قرار دهد.

آیا چیزی است که من از آن چشم پوشی می کنم؟