الگوریتم‌ها، کتابخانه‌ها و واسط‌های برنامه‌نویسی رمزنگاری موجود در iOS

پنج‌شنبه ۲۳ اردیبهشت ۱۳۹۵
sharif-cert, apa, ctf, الگوریتم‌ها، کتابخانه‌ها، واسط‌های برنامه‌نویسی، رمزنگاری، iOS
مرکز آپا شریف
SUT-APA-LOGO
چکیده:
iOS از خصوصیات رمزنگاری و محافظت از داده جهت حفاظت از داده‌های کاربر برخوردار است. این خصوصیات باعث می‌شود حتی اگر در دیگر قسمت‌های زیرساخت امنیتی رخنه شود، بازهم داده‌ها امن بمانند. در این مقاله ابتدا به بررسی الگوریتم‌های رمزنگاری استاندارد در iOS پرداخته و سپس به واسط‌ها و کتابخانه‌های برنامه‌نویسی رمزنگاری موجود اشاره خواهد شد.

مقدمه

iOS سیستم‌عاملی است که توسط شرکت اپل ساخته شده است و در دستگاه‌های قابل حمل مانند آیفون، آیپد و آیپاد استفاده می‌شود. این سیستم‌عامل یکی از امن‌ترین سیستم‌عامل‌های ارائه‌شده برای موبایل بوده و لایه‌های دفاعی و امنیتی مختلفی برای محافظت از داده‌های کاربر و یکپارچگی سیستم بکار گرفته است. درواقع استفاده از زنجیره امن راه‌اندازی، امضای کد و پروسه‌های امنیتی در حال اجرا، تضمین کننده این امر است که تنها کدها و برنامه‌های کاربردی قابل اعتماد می‌توانند روی دستگاه اجرا شوند. در کنار این موارد، iOS از خصوصیات رمزنگاری و محافظت از داده جهت حفاظت از داده‌های کاربر برخوردار است. این خصوصیات باعث می‌شود حتی اگر در دیگر قسمت‌های زیرساخت امنیتی رخنه شود، بازهم داده‌ها امن بمانند. در ادامه ابتدا به بررسی الگوریتم‌های رمزنگاری استاندارد در iOS پرداخته و سپس به واسط‌ها و کتابخانه‌های برنامه‌نویسی رمزنگاری موجود اشاره خواهد شد.

الگوریتم‌های رمزنگاری استاندارد در iOS

iOS تکنولوژی‌های مختلفی را برای مهیا کردن سرویس‌های رمزنگاری، ایجاد کرده است. این تکنولوژی‌ها می‌توانند برای امن کردن داده ذخیره شده، امن کردن داده در حال انتقال، شناسایی هویت شخص ثالث و ساختن تکنولوژی‌های امنیتی دیگر، استفاده کرد. در ادامه به بررسی سرویس‌های رمزنگاری ارائه شده توسط iOS پرداخته خواهد شد.
  • رمزنگاری و رمزگشایی
    لغت رمزنگاری به معنای مخفی کردن و غیرقابل خواندن کردن داده‌ها از دید نگاه‌های کنجکاو است، هرچند که از آن برای مقاصد دیگری نیز استفاده می‌شود. رمزنگاری شامل طیفی از تکنیک‌ها برای بررسی اعتبار داده‌ها (تشخیص تغییرات)، تعیین هویت یک شخص یا نهاد، تشخیص دادن فرستنده پیام، ارسال امن اطلاعات در شبکه، قفل کردن امن فایل‌ها در پس گذرواژه‌ها و غیره می‌شود. در ادامه به توضیح این تکنیک‌ها پرداخته خواهد شد:
  • رمزنگاری و رمزگشایی
    لغت رمزنگاری به معنای مخفی کردن و غیرقابل خواندن کردن داده‌ها از دید نگاه‌های کنجکاو است، هرچند که از آن برای مقاصد دیگری نیز استفاده می‌شود. رمزنگاری شامل طیفی از تکنیک‌ها برای بررسی اعتبار داده‌ها (تشخیص تغییرات)، تعیین هویت یک شخص یا نهاد، تشخیص دادن فرستنده پیام، ارسال امن اطلاعات در شبکه، قفل کردن امن فایل‌ها در پس گذرواژه‌ها و غیره می‌شود. در ادامه به توضیح این تکنیک‌ها پرداخته خواهد شد:
    • رمزنگاری
      به‌طور کلی دو نوع رمزنگاری در امنیت کامپیوتر وجود دارد که به آن رمزنگاری متقارن و نامتقارن گفته می‌شود. در رمز متقارن تنها یک کلید برای رمزنگاری و رمزگشایی مورداستفاده قرار می‌گیرد. الگوریتم‌های متفاوتی با سرعت و کارایی متفاوت برای پیاده‌سازی رمزنگاری متقارن وجود دارند. این الگوریتم‌ها بیشتر برای رمز کردن فایل‌های ذخیره شده روی کامپیوتر مفید هستند، که با استفاده از آن‌ها می‌توان از دسترسی غیرمجاز فرد استفاده کننده از کامپیوتر جلوگیری کرد. اما در زمینه ارسال پیام از کامپیوتری به کامپیوتر دیگر، استفاده از این الگوریتم‌ها مفید به نظر نمی‌رسد، زیرا هر دو طرف ارتباط باید کلید را پردازش کرده و آن را به‌صورت امن ذخیره کنند. درواقع توزیع و نگهداری امن کلیدها سخت بوده و می‌تواند آسیب‌پذیری‌های امنیتی ایجاد کند. هر دستگاه iOS دارای موتور رمزنگاری AES256 بین حافظه کوتاه و حافظه اصلی سیستم است تا از این طریق رمز کردن فایل‌ها را به صورت بهینه انجام دهد، همچنین از AES در حالت کاری CBC استفاده می‌شود. در رمزنگاری نامتقارن از دو کلید مختلف برای رمزنگاری و رمزگشایی استفاده می‌شود. ویژگی این دو کلید این است که با داشتن یک کلید نتوان به کلید دیگر دست یافت. به همین دلیل یک کلید را کلید عمومی و دیگری را کلید خصوصی می‌نامند. از این روش می‌توان هم برای احراز اصالت و هم برای رمزنگاری استفاده کرد. از رمزنگاری نامتقارن می‌توان در تبادل کلید نیز استفاده کرد. یکی از الگوریتم‌های مربوط به رمزنگاری نامتقارن، رمزنگاری نامتقارن منحنی بیضوی است که از آن در iOS برای محافظت از برنامه‌هایی که نیاز به کار حتی در زمان قفل بودن سیستم دارند، استفاده می‌شود. Curve25519 یک روش رمزنگاری با سرعت خیلی زیاد است. تبادل کلید دیفی-هلمن پروتکل تبادل کلید دیفی-هلمن، روشی است که در آن طرفین یک ارتباط می‌توانند به‌صورت امن یک کلید متقارن را از طریق یک کانال ناامن، به اشتراک گذارند. پیاده‌سازی این پروتکل از طریق ریاضیاتی مشابه کلید نامتقارن RSA انجام می‌پذیرد. دیفی-هلمن توسط نسخه ۳.۱ به بعد پروتکل بایگانی اپل و واسط برنامه‌نویسی تبادل امن اپل پشتیبانی می‌شود. از آنجا که رمزنگاری RSA سرعت کمتری نسبت به الگوریتم‌های رمزنگاری متقارن دارد، پروتکل‌هایی مانند دیفی-هلمن (و دیگر روش‌ها که برای به اشتراک‌گذاری کلید متقارن خصوصی استفاده می‌شوند) می‌توانند در مواقعی که حجم زیادی از داده‌های رمز شده باید تبادل شوند، مفید باشند.
    • ‌ توابع درهم‌سازی مبتنی بر رمزنگاری
      توابع درهم‌ساز، توابعی هستند که می‌توانند داده‌های ورودی با هر میزان حجم را به خروجی با سایز ثابت تبدیل کنند. از آنجا که بازسازی پیام اولیه از روی مقدار چکیده آن بسیار سخت یا غیرممکن است، و با احتمال بسیار کمی دو ورودی خروجی یکسانی خواهند داشت، از این توابع در رمزنگاری استفاده می‌شود. از این روش عموماً برای اطمینان از صحت پیام و عدم تغییر آن استفاده می‌شود. معروف‌ترین تابع پیاده‌سازی شده برای درهم‌سازی، SHA-1 است که یک چکیده ۱۶۰ بیتی برای ورودی ایجاد می‌کند، البته الگوریتم‌های دیگری نیز مانند SHA-2 و الگوریتم‌های مبتنی بر منحنی بیضوی نیز وجود دارند. در iOS از SHA-256 به‌عنوان تابع درهم‌ساز استفاده می‌شود.
    • امضای دیجیتال
      امضای دیجیتالی روشی برای اطمینان از یکپارچگی پیام با استفاده از رمزنگاری نامتقارن است. در این روش لازم است فرستنده ابتدا چکیده‌ای از پیامش تولید کند و سپس چکیده پیام را با استفاده از کلید خصوصی‌اش رمز کند. گیرنده نیز پس از دریافت پیام، چکیده پیام را محاسبه کرده، مقدار چکیده دریافتی را با استفاده از کلید عمومی فرستنده رمزگشایی کرده و مقدار این دو را باهم مقایسه می‌کند. امضای دیجیتال نقش کلیدی در فرآیند امضای کد ایفا می‌کند، زیرا لازم است توسعه‌دهندگان برنامه‌های خود را امضا کنند. در زمان اجرا نیز امضای هر برنامه چک و اعتبار سنجی می‌شود. امضای دیجیتال برای تمامی برنامه‌های موجود در iOS الزامی است.
    • گواهی دیجیتال
      گواهی دیجیتال شامل مجموعه‌ای از داده‌های مورداستفاده برای اعتبارسنجی و شناسایی فرستنده گواهی است. هر گواهی دیجیتالی شامل امضای دیجیتال مرکز مجازشماری که گواهی را صادر کرده نیز می‌شود. به‌طورکلی هر گواهی با استفاده از یک گواهی دیگر قابل اعتبار سنجی است که به آن زنجیره اعتماد میگویند. در این زنجیره هر گواهی توسط شخصی امضای دیجیتال می‌شود که آن شخص نیز خود دارای یک گواهی دیجیتال است، هر زنجیره نیز به یک گواهی ریشه ختم می‌شود. در iOS تمامی گواهی‌های دریافت شده در زنجیره کلید ذخیره می‌شوند.
  • مدیریت کلید با استفاده از زنجیره کلید
    زنجیره کلید مکانی برای ذخیره‌سازی گذرواژه‌ها، کلیدها، گواهی‌ها و دیر قسمت‌ها کوچک داده مهیا می‌کند. پس از آنکه برنامه کاربردی درخواست دسترسی به زنجیره کلید را ارسال می‌کند، می‌تواند داده‌های حساس را در آن ذخیره و بازیابی کند. البته این اطمینان وجود دارد که هرگز یک برنامه غیر معتمد قادر به دسترسی به این داده‌ها نخواهد بود. در iOS، یک برنامه تنها قادر به دسترسی به آیتم‌های مربوط به خودش در زنجیره کلید است.
  • تولید عدد تصادفی مقاوم مبتنی بر رمزنگاری
    ایجاد عدد تصادفی برای اغلب الگوریتم‌های رمزنگاری، مورد نیاز است. از آنجا که اعداد تصادفی با یک الگوریتم کامپیوتری ایجاد می‌شود، نمی‌توان آن‌ها را کاملاً تصادفی دانست. بااین‌حال نمی‌توان عدد تصادفی بعدی را با استفاده از توالی اعداد تصادفی تشخیص داد. در iOS می‌توان از سرویس‌های تولید عدد تصادفی استفاده کرد. سرویس‌های تصادفی سازی، تولیدکننده‌ای اعداد تصادفی را در لایه مرکزی سیستم‌عامل فراخوانی می‌کنند. همچنین در این سیستم‌عامل، کلیدهای رمزنگاری با استفاده از RNG تولید می‌شوند که مبتنی بر الگوریتم CTR-DRBG هستند.
  • ارتباطات امن
    یکی از جنبه‌های مهم در امنیت کامپیوتر، امنیت ارتباطات و تبادلات داده روی شبکه است. پروتکل‌هایی مانند SSL و TLS برای این منظور طراحی‌شده‌اند. از این پروتکل‌ها عموماً برای ارتباطات TCP/IP مانند اینترنت استفاده می‌شود. این پروتکل‌ها از احراز هویت مبتنی بر گواهی پشتیبانی کرده و از این طریق تضمین می‌کنند که ارتباط با یک سرور معتبر برقرار خواهد شد. بعلاوه این پروتکل‌ها داده‌ها را نیز اعتبارسنجی می‌کنند تا از تغییر آن‌ها جلوگیری کنند، و با استفاده از رمزنگاری نامتقارن نیز از داده‌ها در مقابل استراق سمع و جعل پیام محافظت می‌کنند. </ul> </div>

    واسط‌های برنامه‌نویسی و کتابخانه رمزنگاری در iOS

    همان‌طور که گفته شد، در iOS تکنولوژی‌های رمزنگاری مختلفی استفاده شده است. واسط‌های برنامه‌نویسی رمزنگاری زیر نیز ازجمله این موارد در iOS است.
    • سرویس زنجیره کلید
      از این واسط عموماً برای ذخیره گذرواژه‌ها، کلیدها و گواهی‌ها در یک فایل رمز شده مخصوص به نام زنجیره کلید استفاده می‌شود. در زنجیره گذرواژه‌ها و یا قسمت‌های کوچکی از داده (مانند کوکی‌ها) که برای دادن دسترسی به وب‌سایت‌های امن استفاده می‌شوند، ذخیره می‌شوند. درصورتی که این اطلاعات در زنجیره کلید ذخیره نشوند، ممکن است در صورت دسترسی فرد غیرمجازی به دستگاه، این اطلاعات به خطر بیفتند. اغلب برنامه‌های کاربردی برای اضافه کردن گذرواژه جدید به زنجیره کلید، تغییر دادن آن یا بازیابی آن در صورت لزوم، از این سرویس استفاده می‌کنند. در iOS هر برنامه‌ای زنجیره کلید خود را داشته و تنها خود برنامه حق دسترسی به آن را دارد. با این کار می‌توان تضمین کرد که داده‌های ذخیره‌شده در زنجیره کلید امن بوده و برای شخص ثالث غیرقابل دسترس است. سرویس زنجیره کلید توابع زیر را برای انجام کارهای گفته‌شده، فراهم می‌کند:
      • SecItemAdd: برای اضافه کردن آیتم به زنجیره کلید.
      • SecItemUpdate: برای تغییر آیتم‌های موجود در زنجیره کلید.
      • SecItemCopyMatching: برای یافتن آیتم‌های زنجیره کلید و استخراج اطلاعات از آن‌ها.
    • سینتکس رمزنگاری پیام
      از این واسط برنامه‌نویسی برای رمز کردن و یا اضافه کردن امضای دیجیتال به پیام‌های S/MIME استفاده می‌شود. S/MIME استانداردی برای رمز کردن و امضا کردن پیام‌ها بوده و معمولاً برای ایمیل استفاده می‌شود. این واسط برای امضا و رمز کردن داده‌های برنامه‌هایی که داده‌ها را ذخیره و ارسال می‌کنند (مانند ایمیل) مناسب است.
    • سرویس‌های گواهی، کلید و اعتماد
      این واسط نیز وظیفه اعتبارسنجی اعتماد و پشتیبانی از توابع رمزنگاری را برعهده دارد. با استفاده از این واسط می‌توان سرویس‌های زیر را در برنامه کاربردی اضافه کرد:
      • ایجاد گواهی و کلید نامتقارن.
      • اضافه و حذف کردن گواهی و کلید از زنجیره کلید، و استفاده از کلید برای رمزنگاری و رمزگشایی داده.
      • بازیابی اطلاعات در مورد گواهی، مانند بازیابی کلید خصوصی اختصاص یافته به گواهی، صاحب گواهی و غیره.
      • ایجاد و تغییر سیاست‌های اعتماد و ارزیابی گواهی با استفاده از مجموعه مشخصی از سیاست‌های اعتماد.
      • اضافه کردن anchor certificates
      • ایجاد امضای دیجیتالی برای بلوک‌های داده با استفاده از کلید خصوصی.
      • بررسی امضا با استفاده از کلید عمومی.
      • رمز کردن بلوک داده با استفاده از کلید عمومی.
      • رمزگشایی بلوک داده با استفاده از کلید خصوصی.
      علاوه بر سه واسط گفته شده، توابع دیگری نیز برای رمزنگاری، رمزگشایی، امضا و تأیید بلوک‌های داده وجود دارد که همگی آن‌ها جزو توابع SecKey هستند:
      • SecKeyEncrypt: رمز کردن بلوک داده با استفاده از کلید مشخص.
      • SecKeyDecrypt: رمزگشایی کردن بلوک داده با استفاده از کلید مشخص.
      • SecKeyRawSign: امضا کردن بلوک داده با استفاده از کلید مشخص.
      • SecKeyRawVerify: تأیید امضای بلوک داده با استفاده از کلید مشخص.
    • واسط برنامه‌نویسی CFNetwork
      CFNetwork یک واسط برنامه‌نویسی موجود در iOS است که برای ایجاد، ارسال و دریافت پیام‌ها روی شبکه استفاده می‌شود. این واسط از قسمت‌های زیر تشکیل شده است:
      • CFHTTPMessage: برای ایجاد، رمزگذاری، رمزگشایی و مدیریت پیام‌های پروتکل HTTP استفاده می‌شود. درصورتی که نیاز به وجود اطلاعات احراز هویت در پیام وجود داشته باشد، لازم است که از این واسط بجای CFHTTP استفاده کنید.
      • CFHTTPAuthentication: برای اعمال گواهی‌های احراز اصالت استفاده می‌شود.
      • CFStream Socket Addition: برای برقراری یک ارتباط داده جریانی مورداستفاده قرار می‌گیرد که نقطه مقابل درخواست‌های HTTP است.
      • CFFTPStream: برای برقراری تبادل فایل با استفاده از پروتکل FTP مورد استفاده قرار می‌گیرد. با استفاده از این قسمت می‌توان گذرواژه‌ها را به کارگذار FTP ارسال کرد.
    • واسط برنامه‌نویسی Secure Transport
      این واسط یک واسط سطح پایین برای کار با SSL و TLS است. از این واسط در iOS استفاده می‌شود و واسط‌های CFNetwork و URL Loading روی آن ساخته می‌شود. با استفاده از Secure Transport می‌توان پارامترهای نشست امن، باز کردن و نگهداری نشست، و بستن نشست را تنظیم کرد. اما از آنجا که این واسط بسیار پیچیده است، توصیه می‌شود تنها در حالتی که کنترل بیشتری نسبت به امکانات وجود در CFNetwork لازم باشد، از Secure Transport استفاده شود.
    • کتابخانه Common Crypto
      از iOS نسخه ۵ به بعد از این کتابخانه برای رمزنگاری و رمزگشایی، درهم‌سازی و مدهای کاری مختلف رمزنگاری استفاده می‌شود. این کتابخانه یک کتابخانه سیستمی بوده و الگوریتم‌های آن برای رسیدن به بیشترین سرعت و کارایی، بهینه‌سازی شده‌اند. </ul> </div> </div>