درک رمزگذاری داده ها در iOS

iOS رمزگذاری را در لایه های مختلف برای محافظت از داده های حساس اجرا می کند.در سطح سخت افزار، Secure Enclave کلیدهای رمزگذاری و عملیات رمزنگاری را مدیریت می کند.در سطح سیستم عامل، حفاظت از داده ها از رمزگذاری سطح فایل استفاده می کند که کلیدهای رمزگشایی را به کد عبور دستگاه متصل می کند.

رمزگذاری متن ساده را به رمز با استفاده از الگوریتم و یک کلید تبدیل می کند (بدون کلید صحیح، داده ها غیرقابل خواندن باقی می مانند. Apple's iOS حفاظت از داده ها] به طور خودکار فایل ها را در بقیه رمزگذاری می کند، اما توسعه دهندگان نیاز به رمزگذاری صریح برای داده های ذخیره شده در خارج از سیستم فایل های محافظت شده دارند - مانند در Core، DataDeult یا کش ها.

کلید گریز: داده های حساس رمزنگاری هر زمان که بر روی دستگاه قرار می گیرد ، حتی اگر رمزگذاری iOS به طور پیش فرض فعال شود، این تضمین حفاظت در برابر دسترسی فیزیکی، استخراج قانونی یا برنامه های مخرب در همان Sandbox.

سیستم های رمزگذاری iOS و API ها

اپل چندین کتابخانه رمزنگاری را فراهم می کند که انتخاب یک کتابخانه مناسب به هدف استقرار و سطح کنترل مورد نیاز بستگی دارد.

CryptoKit - مدرن Swift API

CryptoKit معرفی شده در iOS 13، یک رابط غیر منطقی برای رمزنگاری متقارن و نامتقارن، هشینگ و توافق کلیدی را ارائه می دهد. AES-GCM برای رمزگذاری معتبر، که هر دو محرمانه بودن و یکپارچگی زیر را محافظت می کند، یک رمزنگاری معمول و الگوی رمزگشایی است:

import CryptoKit

func encryptSensitiveData(_ plaintext: String, using key: SymmetricKey) throws -> Data {
 let inputData = Data(plaintext.utf8)
 let sealedBox = try AES.GCM.seal(inputData, using: key)
 return sealedBox.combined
}

func decryptSensitiveData(_ encryptedData: Data, using key: SymmetricKey) throws -> String {
 let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)
 let decryptedData = try AES.GCM.open(sealedBox, using: key)
 return String(decoding: decryptedData, as: UTF8.self)
}

همیشه در این زمینه به جای استفاده از کاربر یا فایل ساده، از [FLT3] استفاده کنید.

CommonCrypto – C-based flex

برای برنامه هایی که از نسخه های قدیمی iOS پشتیبانی می کنند یا نیاز به حالت های سفارشی بلوک (به عنوان مثال CBC با HMAC)، CommonCrypto عملکردهای سطح پایین C را فراهم می کند. از AES، DES، 3DES و الگوریتم های هش مختلف پشتیبانی می کند.

#include <CommonCrypto/CommonCryptor.h>

- (NSData *)aes256Encrypt:(NSData *)plaintext withKey:(NSData *)key iv:(NSData *)iv {
 size_t outLength;
 NSMutableData *ciphertext = [NSMutableData dataWithLength:plaintext.length + kCCBlockSizeAES128];
 CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
 key.bytes, key.length, iv.bytes,
 plaintext.bytes, plaintext.length,
 ciphertext.mutableBytes, ciphertext.length,
 &outLength);
 if (status == kCCSuccess) {
 ciphertext.length = outLength;
 return ciphertext;
 }
 return nil;
}

CommonCrypto نیاز به مدیریت دستی از بردارهای اولیه (IVs) و برچسب های تأیید هویت دارد.برای رمزگذاری معتبر، جفت AES-CBC با HMAC جداگانه یا سوئیچ به AES-GCM از طریق CryptoKit در صورت امکان.

چارچوب امنیتی و Keychain

چارچوب امنیتی خدمات زنجیره ای کلیدی را برای ذخیره سازی امن کلیدها، گواهینامه ها و رمزهای عبور فراهم می کند. برای ذخیره کلیدها با کنترل دسترسی دقیق (به عنوان مثال، نیاز به حضور کاربر از طریق بیومتریک)

پیاده سازی رمزگذاری برای انواع مختلف داده ها

همه داده ها به استراتژی رمزگذاری یکسانی نیاز ندارند.به روش چگونگی و مکان استفاده از داده ها را به کار می برند.

رمزگذاری User Failures و Core Data

UserDefaults و Core Data Store فایل های SQLite ساده هستند مگر اینکه رمزگذاری شده باشند.برای داده های هسته ای، قادر به فعال کردن File protectionType نسبت در فایل فروشگاه.

  • استفاده از داده های هسته ای (FLT:0) قابل انتقال [FLT 1] با یک ترانسفورماتور ارزش سفارشی که رمزگذاری / رمزگشایی در خواندن / نوشتن.
  • کل شیء مدیریت شده را به عنوان JSON، رمزگذاری آن و ذخیره رمز در یک ویژگی باینری.
  • برای UserDefaults، هرگز رشته های حساس خام را ذخیره نکنید؛ هر مقدار را رمزگذاری کنید و داده های رمزگذاری شده را ذخیره کنید.

مثال ذخیره سازی داده های رمزگذاری شده در UserDefaults:

let key = SymmetricKey(size: .bits256)
let data = "user_ssn".data(using: .utf8)!
let sealedBox = try AES.GCM.seal(data, using: key)
UserDefaults.standard.set(sealedBox.combined, forKey: "encrypted_ssn")
UserDefaults.standard.synchronize()

رمزگذاری فایل ها با File Protection

iOS کلاس های محافظت از فایل را ارائه می دهد: و این ویژگی ها را هنگام ایجاد یا حرکت فایل ها تنظیم کنید.

let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)

محافظت از فایل را با رمزگذاری صریح ترکیب کنید اگر داده ها باید محافظت شوند حتی زمانی که دستگاه باز می شود.برای مثال فایل را با یک کلید ذخیره شده در زنجیره کلید رمزگذاری کنید و تنها پس از تأیید اعتبار قابل دسترسی باشد.

رمزگذاری داده های شبکه (Transport Layer Security)

App Transport Security (ATS) HTTPS را به طور پیش فرض اجرا می کند.برای اتصالات TCP سفارشی، از با TLS استفاده کنید یا SSL را برای جلوگیری از حملات انسان-in-the-middle پیاده سازی کنید.بار در لایه نرم افزاری برای دفاع اضافی به صورت عمیق: حتی اگر TLS به خطر افتاده باشد، داده ها همچنان محافظت می شوند.

مدیریت کلید بهترین روش ها

رمزگذاری تنها به اندازه مدیریت کلید قوی است.این دستورالعمل ها را برای حفظ امنیت دنبال کنید:

  • (فَلَّهُمَهُمَهُوا بِنْمَهُمْهِ وَهُمْهُمَهُوا مِنَهُمَهُوا مِنَاًَهُمْهُوا مِنَهُمَاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاًاً
  • ] کلید های فروشگاه به طور انحصاری در زنجیره کلید [FLT 1 ] با ویژگی های دسترسی مناسب: جلوگیری از پشتیبان گیری و پیوند کلید به دستگاه.
  • از بیومتریک یا تأییدیه رمز عبور [FLT 1] قبل از اینکه کلید را روشن کنید استفاده کنید (FLT:15) با تأیید کاربر را تقویت می کند.
  • کلیدها را در یک برنامه یا پس از یک رویداد امنیتی - داده های رمزنگاری با کلید های جدید و به طور ایمن حذف کلید های قدیمی.
  • کلید های سخت کد را در کد منبع یا فایل های پیکربندی، کلید های مشتق از رمز عبور کاربر با استفاده از یک تابع انگیزشی کلید آهسته (PBKDF2 یا scrypt) در صورت لزوم.
  • محاصره امن برای نسل کلیدی نامتقارن — کلید خصوصی نمی تواند صادر شود، جلوگیری از نفوذ.

برای برنامه هایی که داده های بسیار حساس را اداره می کنند، استفاده از یک ماژول امنیتی سخت افزار (HSM) را از طریق سرویس های شبکه در نظر بگیرید، هر چند که تأخیر را معرفی می کند و نیاز به اتصال اینترنت دارد.

کلید های اصلی و Re-encryption

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

  1. یک شناسه کلیدی (به عنوان مثال UUID) را در کنار هر رکورد رمزگذاری شده ذخیره کنید.
  2. یک نقشه برداری از شناسه ها را به کلیدهای واقعی در زنجیره کلید (در حالت استراحت رمزگذاری شده) نگه دارید.
  3. در طول چرخش، بدون بلافاصله تمام داده ها را دوباره رمزگذاری کنید. Re-encrypt lazily پس از دسترسی.

نظرات و مقررات

بسیاری از مقررات رمزگذاری داده های حساس را انجام می دهند. ]GDPR [ نیاز به اقدامات فنی مناسب دارد و رمزگذاری یک تکنیک تشخیص هویتی شناخته شده است. HIPAA رمزگذاری کلید از الزامات داده ePHI در استراحت و حمل و نقل را برآورده می کند. [FLTI. ]

به اسناد رسمی اپل برای آخرین توصیه ها اشاره کنید: [FLT:] راهنمای توسعه دهنده CryptooKit ، و از حریم خصوصی کاربر برای هدایت صنعت، ببینید [FLT6:] راهنمای امنیت موبایل [FIST] و [F7]

تست و اعتبار

پس از اجرای رمزگذاری، آن را به درستی کار کنید:

  • تست های واحد را بنویسید که متن های ساده شناخته شده را رمزگذاری و رمزگشایی کنند و خروجی ها را بیان کنند.
  • موارد لبه تست: داده های خالی، محموله های بسیار بزرگ و رمزنگاری های فاسد.
  • تست امنیتی را با استفاده از یک دستگاه زندانی برای شبیه سازی سناریوهای حمله انجام دهید – و این را بیان کنید که کلیدها بدون تأیید قابل دسترسی باقی می مانند.
  • از ابزارهای تجزیه و تحلیل استاتیک برای اطمینان از هیچ کلید سخت یا الگوریتم های ضعیف استفاده کنید.
  • logs - هرگز داده های حساس متن ساده یا کلیدهای رمزگذاری را وارد نکنید.

نتیجه گیری

پیاده سازی رمزگذاری داده ها برای ذخیره سازی داده های حساس iOS یک فرآیند چند لایه ای است که با ترکیب حفاظت از فایل iOS، رمزگذاری لایه با CryptoKit یا CommonCrypto و مدیریت دقیق کلید از طریق زنجیره کلید و Secure Enclave، توسعه دهندگان می توانند به طور قابل توجهی خطر قرار گرفتن در معرض داده ها را کاهش دهند. انطباق با مقررات مانند GDPR و HIPAA نیاز به روش های رمزگذاری منظم و اطمینان از ایجاد امنیت کاربر در ساختار تنظیم داده ها، اما نه تنها با اطمینان از امنیت بالا.