آیین
آیین
خواندن ۵ دقیقه·۲ روز پیش

چرا نباید از شماره تلفن برای احراز هویت استفاده کنیم؟


درود به همه‌ی خوانندگان عزیز. من بعد از مدتها دوباره دست به قلم شدم (البته دست به کیبورد). اما این دفعه در مورد یک نکته‌ی مهم میخوام بنویسم، که چندین بار از حتی دوستان نزدیکم دیدم که به اشتباه راه‌اندازی میشه: احراز هویت یا لاگین با شماره موبایل!

می‌دونم که همه‌مون دنبال ساده‌ترین راه برای پیاده‌سازی سیستم لاگین هستیم و شاید الان با خودتون بگید "خب چه ایرادی داره از شماره موبایل استفاده کنیم؟ همه دارن همین کار رو می‌کنن!"

اتفاقاً همین که همه دارن این کار رو می‌کنن، باعث شده که این موضوع به یه مشکل امنیتی تبدیل بشه. بذارید از اول براتون توضیح بدم.

مشکل از کجا شروع میشه؟

وقتی یه استارتاپ جدید راه می‌اندازیم، یه اپ جدید میخوایم بنویسیم که نیاز به ورود کاربر داره، همیشه دنبال ساده‌ترین راه‌ها هستیم. یه فرم ساده با شماره موبایل، یه کد تایید پیامکی، و تمام! کاربر ثبت‌نام می‌کنه و وارد اپلیکیشن میشه. به نظر عالی میاد، نه؟ تازه پیاده‌سازیش هم آسونه! اما این سادگی یه قیمت سنگین داره که شاید ازش خبر نداشته باشید. متاسفانه این روش هم به شدت توی ایران، که از لحاظ زیرساخت فنی تو بدترین حالت ممکنه، محبوبیت زیادی داره.

چرا SMS امن نیست؟

اول از همه بیاید یه نگاهی به تکنولوژی SMS بندازیم. می‌دونستید که پروتکل SMS مربوط به اوایل دهه ۹۰ میلادیه؟ یعنی داریم از یه فناوری که برای دوران نوکیا ۳۳۱۰ طراحی شده، برای امنیت اپلیکیشن‌های ۲۰۲۴ استفاده می‌کنیم!

سیستم رمزنگاری شبکه‌ی 3G از الگوریتم‌های A5/1 و A5/3 استفاده می‌کنه که دیگه امن نیستن. هرچند این موضوع توی 4G و 5G خیلی بهتر شده، اما همچنان هکرها می‌تونن با تجهیزات نسبتاً ارزون‌قیمت، پیام‌های SMS رو رهگیری کنن. تصور کنید کد تایید حساب بانکی کاربرتون به جای اینکه به دست خودش برسه، مستقیم میره تو گوشی یه هکر!

مشکل SIM Swapping چیه؟

حالا بیاید به یه مشکل جدی‌تر نگاه کنیم: SIM Swapping یا همون جابجایی سیم‌کارت. این حمله اونقدر ساده‌ست که باورتون نمیشه. هکر کافیه چند تا اطلاعات ساده درباره کاربر شما پیدا کنه (که معمولاً از طریق شبکه‌های اجتماعی به راحتی قابل دسترسه)، بعد با یه تماس با اپراتور و یکم مهندسی اجتماعی، خودش رو جای کاربر جا بزنه.

اپراتورها هم سیستم‌هایی دارن که باید سریع بتونن شماره‌ها رو از یه سیم‌کارت به سیم‌کارت دیگه منتقل کنن (مثلاً برای وقتی که گوشی کسی گم میشه). همین سیستم‌ها باعث میشه که انتقال شماره به سیم‌کارت هکر خیلی سریع انجام بشه.

بازیافت شماره‌ها: یه مشکل پنهان

یه مسئله دیگه که کمتر بهش توجه میشه، بازیافت شماره‌های موبایله. وقتی یه شماره موبایل مدتی غیرفعال می‌مونه (گاهی فقط ۹۰ روز!)، اپراتور اون رو به یه کاربر جدید واگذار می‌کنه. حالا فکر کنید کاربر قدیمی شما کلی سرویس و اپلیکیشن داشته که با اون شماره ثبت‌نام کرده. همه این حساب‌ها میفته دست کاربر جدید!

محدودیت کاربرها

این هم خب واضحه که وقتی شماره موبال رو به عنوان سیستم احراز هویت اصلی میذارید، در واقع دارید در رو روی کاربرهای بین‌المللی میبنید. مثلا وقتی یکی بخواد از یه کشور دیگه وارد سیستم شما بشه و از خدماتتون استفاده کنه، به بن‌بست میخوره! حداقل با ایمیل اون یه‌ذره ارتباط با دنیای بیرون رو حفظ میکنید!

داستان‌های واقعی

اجازه بدید چند تا مثال واقعی براتون بزنم. سال ۲۰۱۹، یه هکر تونست از طریق SIM Swapping به حساب توییتر جک دورسی (مدیرعامل سابق توییتر) دسترسی پیدا کنه [منبع]. یا همین چند وقت پیش، یه گروه هکری تونستن با همین روش به حساب‌های کریپتوی چند نفر دسترسی پیدا کنن و میلیون‌ها دلار سرقت کنن [منبع].

یه مورد دیگه که خیلی جالبه، داستان یه خانمی بود که شماره موبایلش رو از دست داده بود و وقتی دوباره فعالش کرد، متوجه شد تو این مدت یه نفر دیگه با همون شماره به کلی سرویس دسترسی داشته [منبع]!

راه‌حل چیه؟

خب حالا که این همه مشکل رو گفتیم، بیاید ببینیم چه راه‌حل‌هایی داریم:

اول از همه، می‌تونید از سیستم ایمیل و رمز عبور استفاده کنید. درسته که قدیمی به نظر میاد، ولی هنوز هم یکی از امن‌ترین روش‌هاست. برای امنیت بیشتر، می‌تونید احراز هویت دو مرحله‌ای رو با اپلیکیشن‌هایی مثل Google Authenticator یا Authy پیاده‌سازی کنید.

یه راه‌حل مدرن‌تر، استفاده از WebAuthn و FIDO2 هست. این پروتکل‌ها به کاربر اجازه میدن با اثر انگشت یا تشخیص چهره لاگین کنن. شرکت‌های بزرگی مثل گوگل و مایکروسافت دارن به این سمت میرن.

اگه حتماً می‌خواید از شماره موبایل استفاده کنید، حداقل اون رو تنها روش احراز هویت نذارید. می‌تونید از ترکیب چند روش استفاده کنید.

نکات فنی پیاده‌سازی

برای دوستانی که می‌خوان سیستم لاگین امن پیاده‌سازی کنن، چند تا نکته مهم:

  • رمزهای عبور رو حتماً با الگوریتم‌های قوی مثل bcrypt یا Argon2 هش کنید. از ذخیره‌سازی مستقیم رمز تو دیتابیس جداً خودداری کنید.
  • برای توکن‌های احراز هویت، از JWT با کلیدهای رمزنگاری قوی استفاده کنید و حتماً زمان انقضا براشون بذارید.
  • اگه از OAuth استفاده می‌کنید، حواستون به امنیت redirect URL‌ها باشه. این یکی از نقاط آسیب‌پذیر معمول تو سیستم‌های لاگینه.
  • برای جلوگیری از حملات Brute Force، حتماً سیستم محدودسازی تعداد تلاش (Rate Limiting) پیاده‌سازی کنید.

فکر کردن به آینده

دنیای تکنولوژی با سرعت در حال تغییره. همین الان هم شرکت‌های بزرگ دارن به سمت روش‌های جدید احراز هویت مثل Passwordless Authentication میرن. شاید الان استفاده از شماره موبایل ساده‌تر به نظر برسه، ولی در درازمدت می‌تونه مشکلات زیادی ایجاد کنه.

حواسمون باید به این باشه که ما به عنوان توسعه‌دهنده، مسئول امنیت داده‌های کاربرهامون هستیم. شاید پیاده‌سازی یه سیستم امن کمی زمان‌بر باشه، ولی ارزشش رو داره.


نظر شما چیه؟ تجربه‌ای با این مشکلات داشتید؟ چه راه‌حل‌های دیگه‌ای به ذهنتون می‌رسه؟ خوشحال میشم نظراتتون رو تو کامنت‌ها بخونم.

اگه این مطلب براتون مفید بود، حتماً با بقیه توسعه‌دهنده‌ها به اشتراک بذاریدش. هر چقدر آگاهی درباره این موضوع بیشتر بشه، می‌تونیم اپلیکیشن‌های امن‌تری بسازیم.

یادتون باشه: امنیت یه مسابقه نیست که بخوایم توش اول بشیم، یه مسئولیته که باید جدی بگیریمش.

امنیتبرنامه نویسیموبایلحریم خصوصیاحراز هویت
یه برنامه‌نویس با انگیزه که بیشتر تو https://fa.aien.me میچرخه
شاید از این پست‌ها خوشتان بیاید