MR.B4A 183 ارسال شده در 6 مهر اشتراک گذاری ارسال شده در 6 مهر Certificate Pinning 💡 تعریف ساده: Certificate Pinning چیه؟ وقتی اپلیکیشن شما به یک سرور HTTPS وصل میشه، بهطور معمول با گواهی دیجیتال (SSL/TLS certificate) اون سرور ارتباط برقرار میکنه. اما تو این حالت، اپ فقط بررسی میکنه که آیا اون گواهی توسط یک مرجع معتبر (CA) صادر شده یا نه. مفهوم Certificate Pinning یکی از روشهای مهم برای افزایش امنیت ارتباطات HTTPS توی اپلیکیشنهاست، مخصوصاً اپهای موبایل یا کلاینتهایی که به سرور متصل میشن. 🟥 حالا مشکل کجا پیش می آید؟! اگه یه مهاجم (مثلاً در حمله man-in-the-middle) بتونه یه گواهی جعلی از یه CA معتبر بگیره، ممکنه کاربر بدون اینکه متوجه بشه، به سرور جعلی وصل بشه! Man-in-the-Middle (یا MITM) یعنی چی؟ ⚡ "مرد میانی" یه نوع حملهست که توش یه هکر میاد وسط ارتباط بین دو نفر (مثلاً اپ شما و سرور) و بدون اینکه کسی بفهمه، اطلاعات رو میخونه، تغییر میده یا دزدی میکنه. ✳️ مثال ساده: شما با گوشیتون به یه سرور وصل میشی (مثلاً بانک یا اپ خودت). یه هکر توی همون وایفای عمومی (کافه، فرودگاه...) میاد وسط ارتباطتون. اطلاعات شما (مثل رمز، شماره کارت، پیامها) قبل از اینکه به سرور برسه، میره پیش اون هکر. Certificate Pinning چیکار میکنه؟ 📣 با Certificate Pinning، شما به اپلیکیشن میگید: فقط به این گواهی (یا کلید عمومی خاصی) اعتماد کن — حتی اگه گواهی معتبر دیگهای ارائه شد، قبول نکن. یعنی گواهی یا کلید عمومی خاصی رو "سنجاق" (pin) میکنی به اپ. ❓ انواع Pinning: 1-Public Key Pinning (کلید عمومی) فقط کلید عمومی رو ذخیره میکنی، اگر گواهی عوض شد ولی کلید عمومی همونه، مشکلی نیست. 2-Certificate Pinning (گواهی کامل) کل گواهی یا fingerprint اون رو ذخیره میکنی —اگه عوض بشه، حتی اگه قانونی باشه، اتصال رد میشه. ✅ مزایای Certificate Pinning: محافظت در برابر حملات MITM امنتر از اعتماد کامل به CAهای عمومی 💣 معایب اگه سرور گواهیش رو عوض کنه و اپ هنوز با گواهی قبلی pin شده باشه، اتصال fail میشه (مگر اپ بهروز بشه) در صورت پیادهسازی اشتباه، میتونه باعث قفل شدن اپ بشه ❇️ پیاده سازی در B4A پیادهسازی Certificate Pinning در B4A ممکنه، ولی چون B4A سطح بالاتری داره و مستقیماً به کلاسهای جاوای SSL/TLS دسترسی نمیده، باید با کمی ترفند و استفاده از JavaObject یا inline Java کار رو انجام بدی. 1-برای پین کردن گواهی از OkHttpUtils2 + JavaObject استفاده کنید. این دو کتابخونه رو توی b4a تیک بزنید. 2-دریافت گواهی SHA-256 از سایت مثل https://www.sslshopper.com یا با ابزار openssl استفاده کن یک کلید این شکلی دریافت میکنید openssl s_client -connect yourdomain.com:443 </dev/null 2>/dev/null | openssl x509 -noout -pubkey | openssl pkey -pubin -outform DER | openssl dgst -sha256 -binary | base64 3-این هم روش کلی استفاده در بیسیک فور اندروید هست که باید با توجه به پروژه تان آن را تغییر دهید. Sub Process_Globals Private client As OkHttpClient End Sub Sub Globals End Sub Sub Activity_Create(FirstTime As Boolean) If FirstTime Then InitClientWithPinning End If Dim req As OkHttpRequest req.Initialize("job", "https://yourdomain.com") Dim job As OkHttpJob job.Initialize("job", Me) job.client = client job.Download2("https://yourdomain.com", Null) End Sub Sub InitClientWithPinning Dim jo As JavaObject jo.InitializeNewInstance("okhttp3.CertificatePinner$Builder", Null) jo = jo.RunMethod("add", Array("yourdomain.com", "sha256/AbCdEfGhIjK...==")) Dim pinner As JavaObject = jo.RunMethod("build", Null) Dim okClientBuilder As JavaObject okClientBuilder.InitializeNewInstance("okhttp3.OkHttpClient$Builder", Null) okClientBuilder.RunMethod("certificatePinner", Array(pinner)) Dim okClient As JavaObject = okClientBuilder.RunMethod("build", Null) client.InitializeAcceptAll Dim joClient As JavaObject = client joClient.SetField("client", okClient) End Sub 🔥 نکات مهم: این کد فقط درخواستهایی که از job.client = client استفاده میکنن رو pin میکنه. آدرس "yourdomain.com" باید دقیق باشه (مثل: api.yourapp.com) پینها ممکنه expire بشن؛ برای همین همیشه باید بدونی کی گواهی عوض میشه. 1 نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
ارسالهای توصیه شده
به گفتگو بپیوندید
هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .
توجه: strong> مطلب ارسالی شما پس از تایید مدیریت برای همه قابل رویت خواهد بود.