در این مقاله توضیح میدیم که احراز هویت در MQTT چطور کار میکنه و چه مخاطرات امنیتی رو برطرف میکنه و همچنین کلمه عبور مبتنی بر احراز هویت (password-based authentication) در این پروتکل رو معرفی خواهیم کرد.
احراز هویت فرآیند شناسایی کاربر و تأیید دسترسی آنها به یک سیستم یا سرور است. این یک اقدام امنیتی که سیستم رو از دسترسی غیرمجاز محافظت و تضمین میکنه تا فقط کاربران معتبر بتونن از سیستم استفاده کنند.
با توجه به ماهیت گسترده صنعت اینترنت اشیا، هویت افرادی که به دنبال دسترسی به زیرساخت آن هستند، باید بررسی بشه. ورود غیرمجاز جزو تهدیدات امنیتی بشمار میاد و باید از آن جلوگیری کرد. به همین دلیله که توسعه دهندگان اینترنت اشیا باید درک جامعی از روش های مختلف احراز هویت داشته باشند.
امروز توضیح خواهیم داد که احراز هویت در MQTT چگونه کار میکنه. همچنین چه خطرات امنیتی رو برطرف میکنه و اولین روش احراز هویت یعنی احراز هویت مبتنی بر رمز عبور معرفی خواهیم کرد.
احراز هویت در MQTT به چه معناست؟
احراز هویت در MQTT به فرآیند تأیید هویت یک مشتری یا یک واسط (broker) قبل از اجازه دادن به آنها برای برقراری ارتباط یا تعامل با شبکه MQTT اشاره داره که این فقط در مورد حق اتصال به واسط هست. مبحثی که تعیین میکنه مشتری مجاز به انتشار و اشتراک گذاری در کدام موضوعات هست، کاملا جداست که در مقالات آینده به آن میپردازیم.
واسط MQTT میتونه مشتریان رو عمدتاً به روش های زیر احراز هویت کنه:
- احراز هویت مبتنی بر رمز عبور (Password-based authentication): واسط تأیید میکنه که مشتری بر اساس نام کاربری، شناسه مشتری و رمز عبور دارای اعتبار اتصال صحیح هست یا نه. همچنین واسط میتونه نام کاربری(username) یا شناسه مشتری(client ID) رو در برابر رمز عبور تأیید کنه.
- احراز هویت پیشرفته (SCRAM): این روش مشتری هارو با استفاده از یک راه کار مبتنی بر چالش رفت و برگشت که به نام راهکار احراز هویت Salted Challenge Response هم شناخته میشه، احراز هویت میکنه.
کلمه عبور مبتنی بر احراز هویت
هدف احراز هویت مبتنی بر گذرواژه اینه که مشخص کنه آیا اتصال شخص (با تأیید اعتبار اطلاعات رمز عبور) قانونی هست یا نه.
احراز هویت مبتنی بر رمز عبور در MQTT به طور کلی به استفاده از نام کاربری و رمز عبور برای احراز هویت مشتریان اشاره داره که البته این موارد توصیه هم میشوند. با این حال، در برخی از کاربردها، بعضی از مشتریان ممکنه نام کاربری نداشته باشن، بنابراین شناسه مشتری(client ID) هم میتوانه به عنوان یک شناسه منحصر به فرد برای نشان دادن هویت استفاده بشه.
هنگامی که یک مشتری MQTT به واسط متصل میشه، نام کاربری و رمز عبور خود را در یک بسته CONNECT ارسال میکنه. مثال زیر با استفاده از نرم افزار Wireshark بسته CONNECT رو برای یک مشتری با مقادیر مربوط به client1، user و MySecretPassword نشون میده.
بعد از اینکه واسط نام کاربری (یا شناسه مشتری) و رمز عبور رو از بسته CONNECT دریافت کرد، باید اعتبارنامه های ذخیره شده قبلی رو در پایگاه داده مربوطه با توجه به نام کاربری جستجو و سپس با رمز عبور ارائه شده توسط مشتری مقایسه کنه. اگر نام کاربری در پایگاه داده پیدا نشه، یا رمز عبور با اعتبار موجود در پایگاه داده مطابقت نداشته باشه، واسط درخواست اتصال مشتری رو رد میکنه.
این نمودار یک واسط رو نشون میده که از PostgreSQL برای احراز هویت نام کاربری و رمز عبور مشتری استفاده میکنه.

احراز هویت مبتنی بر رمز عبور یک خطر امنیتی رو حل میکنه. مشتریانی که دارای اعتبار صحیح (نام کاربری و رمز عبور) نیستن، نمیتونن به واسط متصل بشن. با این حال، همونطور که در خروجی نرم افزار Wireshark مشاهده میکنین، از آنجایی که همه چیز به صورت متن ساده است، هکری که به کانال ارتباطی دسترسی داره میتونه به راحتی بسته ها و اعتبار اتصال رو مشاهده کنه.
با ترفند Salt و Hash پسورد هاتون رو ایمن کنید
ذخیره گذرواژه ها در متن ساده، روشی ایمن به شمار نمیاد چون رمزهای عبور رو در برابر حملات آسیب پذیر میکنه. اگر مهاجم به یک پایگاه داده یا فایل رمز عبور دسترسی پیدا کنه، به راحتی میتونه برای دسترسی غیرمجاز به سیستم، رمزهای عبور رو بخونه. برای جلوگیری از این اتفاق، گذرواژهها باید در قالب درهم سازی (hashed) و شور شده (salted) ذخیره بشن.
درهم سازی (hash) چیست؟
این تابعی هست که مقداری داده ورودی رو میگیره، یک الگوریتم ریاضی رو روی داده ها اعمال میکنه و سپس یک خروجی کاملا بی معنی تولید میکنه. هدف اینه که داده های ورودی اصلی رو مبهم کنیم، همچنین عملکرد باید یک طرفه باشه. یعنی هیچ راهی برای محاسبه ورودی با توجه به خروجی وجود نداشته باشه. با این حال، روش های درهم سازی به خودی خود امن نیستند و میتونن در برابر حمله واژه نامه ای(dictionary attack) آسیب پذیر باشن.
به مثال زیر دقت کنید:
این هش sha256 رو در نظر بگیرید:
8f0e2f76e22b43e2855189877e7dc1e1e7d98c226c95db247cd1d547928334a9
در نگاه اول که امن بنظر میاد، حتی با بررسی رمز عبور هم نمیتونید بفهمید که چیست. اما مشکل اینه که برای یک رمز عبور ثابت، درهم سازی همیشه همان نتیجه رو ایجاد میکنه. بنابراین، ایجاد یک پایگاه داده از رمزهای عبور رایج و مقادیر هش آنها بسیار آسونه.
به عنوان مثال:
یک هکر میتونه این رشته درهم سازی شده رو در یک پایگاه داده درهم سازی آنلاین جستجو کنه و بفهمه که رمز عبور در واقع “passw0rd” هست.
ترفند شور نمودن چیست؟
ترفند شور نمودن این مشکلِ رمز عبور رو حل میکنه. شوری یک رشته تصادفی از کاراکترها هست که قبل از درهم سازی به رمز عبور اضافه میشه. این باعث میشه هر رمز عبور درهم سازی منحصر به فرد داشته باشه، حتی اگر رمزهای عبور یکسان باشن. مقدار شوری در کنار رمز عبور درهم سازی شده در پایگاه داده ذخیره میشه. هنگامی که یک کاربر وارد سیستم میشه، شوری به رمز عبور او اضافه میشه و درهم سازی حاصل، با درهم سازی ذخیره شده در پایگاه داده مقایسه میشه. اگر درهم سازی ها مطابقت داشته باشن، به کاربر اجازه دسترسی داده میشه.
فرض کنید قبل از اجرای تابع درهم سازی، یک رشته متن تصادفی به رمز عبور اضافه کنیم. رشته تصادفی همان مقدار شوری نامیده میشه.
اگر مثال قبل رو با مقدار شوری (az34ty1) درهم سازی کنیم (passw0rdaz34ty1) مقدار زیر بدست میاد:
6be5b74fa9a7bd0c496867919f3bb93406e21b0f7e1dab64c038769ef578419d
بسیار بعیده که در یک پایگاه داده همچین درهم سازی وجود داشته باشه، چون به تعداد زیادی ورودی درهم سازی پایگاه داده فقط برای مقدار متن ساده passw0rd نیاز هست.
بهترین راه های ارتقای کلمه عبور مبتنی بر احراز هویت در MQTT
در اینجا دو نکته کلیدی از مواردی که در این مقاله ذکر کردیم لیست شده که میتونه بهترین روش برای احراز هویت مبتنی بر رمز عبور در MQTT باشه:
- یکی از مهمترین جنبه های احراز هویت مبتنی بر رمز عبور در MQTT، انتخاب رمزهای عبور قوی و منحصر به فرد هست. گذرواژه هایی که به راحتی قابل حدس زدن یا استفاده مجدد در چندین حساب هستند میتونن امنیت کل شبکه MQTT رو به خطر بیندازند.
- همچنین ذخیره و انتقال ایمن رمزهای عبور برای جلوگیری از سرقت رفتن آنها توسط افراد نادرست، بسیار مهمه. به عنوان مثال، رمزهای عبور باید قبل از ذخیره سازی درهم سازی و شور شده شوند و از طریق کانال های امن مانند TLS منتقل شوند.
جمعبندی
احراز هویت مبتنی بر رمز عبور نقش مهمی در ایمن سازی پروتکل ارتباطی MQTT و محافظت از یکپارچگی سیستم های اینترنت اشیا ایفا میکنه. توسعه دهندگان اینترنت اشیا با پیروی از بهترین شیوه ها برای انتخاب رمز عبور، ذخیره سازی و انتقال، آگاهی از مسائل رایج مانند حملات brute-force، میتونن به تضمین امنیت شبکه های MQTT خود کمک کنن.
احراز هویت مبتنی بر رمز عبور تنها یکی از روشهای احراز هویت موجود در MQTT هست و ممکنه همیشه برای هر موردی مناسب نباشه. برای مثال، روشهای پیشرفتهتر مانند گواهیهای دیجیتال یا OAuth 2.0 ممکنه امنیت قویتری رو در سناریوهای خاص فراهم کنن. بنابراین، برای توسعه دهندگانِ اینترنت اشیا مهمه که با آخرین روش های احراز هویت به روز بمونن و روشی رو انتخاب کنن که به بهترین وجه نیازهای برنامه آنها رو برآورده کند.