پیش تر به بررسی کلاس دستگاه های LoRaWAN پرداختیم. هر دستگاه LoRaWAN برای اینکه بتونه پیام بفرسته یا دریافت کنه، باید توی یک شبکه ثبت بشه. به این فرآیند فعالسازی (Activation) گفته میشه. برای این کار دو روش وجود داره:
این روش امنترین و همینطور روش پیشنهادی برای فعالسازی دستگاههاست. در OTAA، دستگاه یک فرآیند join رو با شبکه انجام میده. طی این فرآیند، یک آدرس پویا (Dynamic Device Address) به دستگاه اختصاص داده میشه و کلیدهای امنیتی هم بین دستگاه و شبکه مذاکره و تنظیم میشن.
اینجا برعکس OTAA، آدرس دستگاه و کلیدهای امنیتی باید بهصورت دستی داخل دستگاه کدنویسی یا همون hardcode بشن. این روش امنیت کمتری نسبت به OTAA داره. از طرف دیگه، یک محدودیت مهم هم داره: دستگاهی که با ABP فعالسازی شده، نمیتونه به راحتی شبکه رو تغییر بده؛ مگر اینکه کلیدها و آدرس توی خود دستگاه بهصورت دستی عوض بشن.
نکته پایانی اینکه فرآیند join برای نسخههای مختلف LoRaWAN کمی فرق میکنه. بهطور خاص بین نسخه 1.0.x و 1.1 تفاوتهایی وجود داره که باید جداگانه توضیح داده بشن.
در نسخه 1.0.x از LoRaWAN، فرآیند join یا همون فعالسازی با تبادل دو پیام MAC بین دستگاه و سرور شبکه انجام میشه:
قبل از اینکه فعالسازی شروع بشه، چند داده باید داخل دستگاه ذخیره شده باشه:
نکته خیلی مهم اینه که AppKey هیچوقت روی شبکه ارسال نمیشه. یعنی امنیت اصلی OTAA همینجاست؛ کلید ریشه همیشه محفوظ میمونه و فقط برای تولید کلیدهای جلسه (Session Keys) استفاده میشه.
فرآیند join همیشه از سمت دستگاه شروع میشه. دستگاه یک پیام Join-request به شبکهای که میخواد بهش متصل بشه ارسال میکنه. این پیام شامل سه بخش اصلیه:
برای اینکه امنیت تضمین بشه، یک Message Integrity Code (MIC) روی همه این فیلدها محاسبه میشه. این MIC با استفاده از AppKey تولید میشه و بعد به پیام Join-request اضافه میشه.
پیام Join-request میتونه با هر نرخ دادهای (Data Rate) و از طریق یکی از کانالهای مخصوص فعالسازی (join channels) ارسال بشه. مثلاً در اروپا دستگاه میتونه به صورت تصادفی یکی از فرکانسهای 868.10 MHz، 868.30 MHz یا 868.50 MHz رو انتخاب کنه. بعد این پیام از طریق یک یا چند گیتوی به سرور شبکه منتقل میشه.
بعد از اینکه سرور شبکه پیام Join-request رو دریافت و بررسی کرد، اگر دستگاه مجاز به ورود به شبکه باشه، دو کلید جلسه (Session Keys) تولید میکنه:
همچنین یک پیام Join-accept برای دستگاه آماده و ارسال میکنه. این پیام شامل فیلدهای زیره:
برای حفظ امنیت، یک Message Integrity Code (MIC) روی تمام این فیلدها با استفاده از AppKey محاسبه میشه و به پیام Join-accept اضافه میشه.
نکته مهمتر اینه که خود پیام Join-accept رمزگذاری میشه. سرور شبکه برای رمزگذاری این پیام از الگوریتم AES در حالت ECB استفاده میکنه. جالب اینجاست که برخلاف همیشه، اینجا از عملیات Decrypt در AES-ECB استفاده میشه تا پیام Join-accept رمزگذاری بشه 🙂. آره میدونم یکم عجیبه ولی هست دیگه.
وقتی سرور شبکه پیام Join-accept رو آماده و رمزگذاری کرد، اون رو مثل یک پیام downlink عادی برای دستگاه میفرسته. دستگاه این پیام رو دریافت میکنه، رمزگشایی انجام میده و بر اساس اطلاعات داخلش (مثل AppNonce، NetID و DevAddr) کلیدهای جلسه خودش رو تولید میکنه. از این لحظه به بعد، دستگاه بهطور کامل عضو شبکه شده و میتونه ارتباط امن برقرار کنه.
نکته مهم اینجاست که اگر سرور شبکه تصمیم بگیره پیام Join-request رو نپذیره، هیچ پاسخی به دستگاه ارسال نمیکنه. یعنی در عمل سکوت سرور به معنای رد شدن درخواست دستگاهه.
وقتی پیام Join-accept پردازش شد و دستگاه عضو شبکه شد، سرور شبکه کلیدهای جلسه رو مدیریت میکنه. کلید NwkSKey (کلید شبکه) پیش خودش نگه داشته میشه تا برای اعتبارسنجی و مدیریت پیامهای مربوط به شبکه استفاده بشه. در عوض، کلید AppSKey (کلید اپلیکیشن) به سرور اپلیکیشن منتقل میشه. اینطوری دادههایی که دستگاهها میفرستن فقط توسط همون اپلیکیشن مقصد قابل رمزگشایی هستن، نه توسط اپراتور شبکه.
این تفکیک باعث میشه شبکه بتونه multi-tenant باشه؛ یعنی یک اپراتور بتونه سرویس رو به چند شرکت یا اپلیکیشن مختلف بده، بدون اینکه خودش دسترسی به دادههای واقعی اونها داشته باشه.
وقتی دستگاه پیام Join-accept رو دریافت کرد، با استفاده از الگوریتم AES (در حالت encrypt) اون رو رمزگشایی میکنه. در این مرحله دستگاه با استفاده از AppKey و مقدار AppNonce، دو کلید جلسه خودش رو مشتقسازی میکنه:
از این لحظه به بعد، دستگاه رسماً روی شبکه فعال (Activated) شده و آماده برقراری ارتباط امنه.
بعد از فعالسازی، چند اطلاعات مهم جدید هم داخل دستگاه ذخیره میشه:
به این ترتیب، دستگاه هم آدرس خودش رو در شبکه میگیره و هم کلیدهای امنیتی لازم رو. نتیجه این میشه که هم یکپارچگی دادهها و هم محرمانگی اونها تضمین میشه، بدون اینکه کلید ریشه (AppKey) هیچوقت روی شبکه جابهجا شده باشه.
در LoRaWAN نسخه 1.0.x، فرآیند join شامل تبادل دو پیام MAC بین دستگاه و سرور شبکه بود: Join-request و Join-accept. اما در نسخه 1.1 یک تغییر مهم ایجاد شده و این فرآیند حالا بین دستگاه انتهایی و Join Server انجام میشه.
قبل از شروع فعالسازی، چند داده باید داخل دستگاه ذخیره بشن:
برای اینکه فرآیند درست انجام بشه، همین AppKey، NwkKey و DevEUI باید از قبل روی Join Server هم Provision بشن، چون این سرور مسئول پردازش درخواست Join و تولید کلیدهای جلسه (Session Keys) هست.
نکته مهم اینه که درست مثل نسخه قبلی، AppKey و NwkKey هیچوقت روی شبکه ارسال نمیشن. این کلیدها فقط روی دستگاه و Join Server باقی میمونن و امنیت اصلی LoRaWAN 1.1 رو تضمین میکنن.
همونطور که در نسخه قبلی هم بود، فرآیند join همیشه از سمت دستگاه شروع میشه. دستگاه یک پیام Join-request به شبکهای که میخواد بهش متصل بشه ارسال میکنه. این پیام شامل سه بخش اصلیه:
روی همه این فیلدها یک MIC (Message Integrity Code) محاسبه میشه که این بار با استفاده از NwkKey ساخته میشه و به پیام Join-request اضافه میشه.
توجه: کلید NwkKey هیچوقت ارسال نمیشه و پیام Join-request هم رمزگذاری نمیشه؛ به صورت متن ساده (Plain Text) ارسال میشه.
دستگاه میتونه این پیام رو با هر نرخ دادهای و از طریق یکی از کانالهای مخصوص فعالسازی (join channels) ارسال کنه. مثلاً در اروپا دستگاه میتونه بهصورت تصادفی یکی از فرکانسهای 868.10 MHz، 868.30 MHz یا 868.50 MHz رو انتخاب کنه. پیام Join-request از طریق یک یا چند گیتوی به سرور شبکه میرسه.
در نهایت اگر درخواست توسط سرور پذیرفته نشه، هیچ پاسخی به دستگاه داده نمیشه؛ یعنی سکوت سرور یعنی رد شدن Join-request.
وقتی سرور شبکه پیام Join-request رو دریافت میکنه، اون رو به سرور مربوطه یعنی Join Server فوروارد میکنه. این همون سروریه که مسئول بررسی درخواستهای Join و مدیریت کلیدهای امنیتی هست.
سرور Join پیام Join-request رو پردازش میکنه. اگر دستگاه مجاز به ورود به شبکه باشه، سرور Join چهار کلید جلسه تولید میکنه:
این تفاوت بزرگ LoRaWAN 1.1 نسبت به نسخه 1.0.x هست؛ جایی که فقط دو کلید جلسه (AppSKey و NwkSKey) وجود داشتن. در نسخه 1.1 برای امنیت بیشتر، کلیدهای شبکه به سه بخش مجزا تقسیم شدن تا مسئولیتها و کاربردهای امنیتی دقیقتر تفکیک بشن.
اگر در گام قبل سرور Join اجازه اتصال دستگاه رو تأیید کنه و کلیدها با موفقیت تولید بشن، سرور شبکه پیام Join-accept رو آماده میکنه. این پیام شامل فیلدهای زیره:
برای اینکه امنیت تضمین بشه، روی تمام این فیلدها یک Message Integrity Code (MIC) محاسبه میشه. این MIC در LoRaWAN 1.0 با استفاده از NwkKey ساخته میشد، اما در LoRaWAN 1.1 با JSIntKey محاسبه میشه. MIC به پیام اضافه میشه تا تضمین بشه هیچ تغییری توی مسیر ایجاد نشده.
خود پیام Join-accept هم رمزگذاری میشه. سرور شبکه برای این کار از الگوریتم AES در حالت ECB استفاده میکنه (جالبه که برای رمزگذاری از عملیات Decrypt در AES-ECB استفاده میشه). اگر پیام Join-accept بهدنبال یک Join-request ایجاد شده باشه، با NwkKey رمزگذاری میشه. ولی اگر پیام در پاسخ به یک Rejoin-request ساخته شده باشه، از JSEncKey استفاده میشه.
در نهایت، سرور شبکه پیام Join-accept رمزگذاریشده رو بهعنوان یک پیام downlink معمولی به دستگاه میفرسته. دستگاه هم پس از دریافت، اون رو پردازش و کلیدهای جلسه خودش رو تولید میکنه.
وقتی فرآیند Join به پایان رسید و کلیدها ساخته شدن، وظیفه تقسیم این کلیدها بین اجزای مختلف شبکه بر عهده Join Server هست. در این مرحله:
با این تفکیک، امنیت در LoRaWAN 1.1 یک لایه جدیتر پیدا میکنه. اپراتور شبکه دیگه دسترسی مستقیم به دادههای اپلیکیشن نداره، چون AppSKey فقط در اختیار سرور اپلیکیشن قرار میگیره. از اون طرف، Network Server هم با کلیدهای مخصوص خودش میتونه یکپارچگی و امنیت پیامها رو تضمین کنه.
به این ترتیب، دستگاه بهطور کامل فعال میشه و شبکه هم آماده برقراری ارتباطهای امن و پایدار خواهد بود.
وقتی دستگاه پیام Join-accept رو دریافت میکنه، اون رو با استفاده از الگوریتم AES (در حالت encrypt) رمزگشایی میکنه. بعد با کمک کلیدهای ریشه یعنی AppKey، NwkKey و مقدار JoinNonce، کلیدهای جلسه (Session Keys) خودش رو تولید میکنه.
نحوه تولید کلیدها بسته به نسخه LoRaWAN متفاوته:
به این ترتیب دستگاه حالا رسماً روی شبکه فعال شده و آماده تبادل دادههای امنه.
بعد از فعالسازی، اطلاعات زیر داخل دستگاه ذخیره میشه:
به این شکل، بعد از گام ششم همهچیز آماده است: دستگاه هم آدرس داره، هم کلیدهای امنیتی کامل، و هم یک کانال امن برای تبادل داده با شبکه و اپلیکیشن.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.