דואר ארגוני באייפון אישי: עובד מעתיק קובץ מצורף — והנתונים הופכים מיד לנגישים לכל האפליקציות שלו דרך הלוח המשותף. 70% מהחברות עם מדיניות BYOD מתמודדות עם דליפות כאלה. המהנדסים שלנו מציעים קונטיינריזציה של נתונים ארגוניים — בידוד רב-שכבתי ממערכת הקבצים ועד לתעבורת הרשת.这不是 רק הצפנה, אלא הגנה מקיפה: VPN לכל אפליקציה, לוח פרטי, וקונטיינר קבצים ייעודי. מאמר זה מכסה את היישום של קונטיינר נתונים ב-iOS וב-Android עם דוגמאות קוד.
לפי Apple Keychain Services, הצפנת חומרה זמינה דרך Secure Enclave. כעת נפרק כיצד זה עובד בשתי הפלטפורמות.
כיצד לבודד נתונים ארגוניים מנתונים אישיים ב-iOS וב-Android?
iOS: Keychain Access Groups + Data Protection API. פריטי Keychain עם accessGroup משותף נגישים למספר אפליקציות מאותו ספק — זהו מנגנון שיתוף הסודות הבסיסי. לצורך בידוד, אנו עושים ההפך: לכל אפליקציה יש קטע Keychain משלה שאינו נגיש לאחרים ללא Access Group מפורש.
מחלקות Data Protection קובעות מתי הנתונים מפוענחים:
// Файл доступен только при разблокированном устройстве
let attrs: [FileAttributeKey: Any] = [
.protectionKey: FileProtectionType.complete
]
try FileManager.default.setAttributes(attrs, ofItemAtPath: filePath)
// Для Keychain-записей
let query: [String: Any] = [
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]// Файл доступен только при разблокированном устройстве let attrs: [FileAttributeKey: Any] = [ .protectionKey: FileProtectionType.complete ] try FileManager.default.setAttributes(attrs, ofItemAtPath: filePath) // Для Keychain-записей let query: [String: Any] = [ kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly ] — המפתח קשור למכשיר (לא מועבר ל-iCloud Backup) ונגיש רק כשהמסך לא נעול. עבור נתונים ארגוניים, זו רמת הגנה מינימלית מספקת.
Android: Work Profile + EncryptedSharedPreferences + Keystore. Work Profile יוצר מרחב משתמש מבודד עם מופע Keystore נפרד. kSecAttrAccessibleWhenUnlockedThisDeviceOnly מצפין מפתחות וערכים באמצעות ספריית Tink:
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val sharedPreferences = EncryptedSharedPreferences.create(
context,
"corporate_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)עבור קבצים — EncryptedSharedPreferences מ-val masterKey = MasterKey.Builder(context) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .build() val sharedPreferences = EncryptedSharedPreferences.create( context, "corporate_prefs", masterKey, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) :
val encryptedFile = EncryptedFile.Builder(
context,
File(context.filesDir, "corporate_document.enc"),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
encryptedFile.openFileOutput().use { output ->
output.write(corporateData)
}השוואה: Keychain עם Access Group מאובטח פי 10 מאחסון ב-UserDefaults בזכות הצפנת חומרה. ב-Android, EncryptedSharedPreferences משתמש ב-AES-256, שהוא אמין פי 5 מ-SharedPreferences רגיל.
| פרמטר | iOS | Android |
|---|---|---|
| הצפנת אחסון | Keychain + Data Protection (AES-256) | EncryptedSharedPreferences + Keystore (AES-256) |
| בידוד אפליקציות | Sandbox + Keychain Access Groups | Work Profile + Keystore מבודד |
| בידוד רשת | NEAppProxyProvider + MDM | VpnService + allowedApplications |
| גיבוי | חסום דרך Data Protection | מושבת דרך Android Backup Manager |
מדוע VPN לכל אפליקציה הוא רכיב אבטחה קריטי?
נתונים ארגוניים לא חייבים לדלוף דרך ערוצי רשת אישיים. יישום דרך VPN לכל אפליקציה:
- iOS:
EncryptedFile+ תצורת MDM. MDM מקצה VPN למזהה bundle ספציפי. תעבורה מאותה אפליקציה עוברת דרך VPN ארגוני; תעבורה מאפליקציות אישיות עוברת ישירות. - Android:
androidx.security:security-cryptoעםval encryptedFile = EncryptedFile.Builder( context, File(context.filesDir, "corporate_document.enc"), masterKey, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build() encryptedFile.openFileOutput().use { output -> output.write(corporateData) }ב-NEAppProxyProvider. רק החבילות הרשומות מנותבות דרך מנהרה.
ללא VPN לכל אפליקציה, החלופה היא VpnService עם allowedApplications והגדרות Corporate Proxy כפויות דרך VpnProfile.
VPN לכל אפליקציה מבטיח שתעבורת אפליקציות ארגוניות לא מתערבבת עם תעבורה אישית, ומפחית את הסיכון לדליפה דרך רשתות Wi-Fi לא מאובטחות. זו דרישת חובה לעמידה ב-PCI DSS ו-HIPAA.
קונטיינר קבצים: יישום מותאם אישית
עבור אפליקציות הדורשות שליטה מלאה בהצפנה (פיננסיות, רפואיות), ייתכן שיהיה צורך בקונטיינר קבצים מותאם אישית — דומה לנפח VeraCrypt אך ברמה הניידת.
ארכיטקטורת קונטיינר קבצים
container.vault
├── header (256 bytes): version, salt, PBKDF2 params, iv
├── index.enc: CBOR-манифест файлов (имя, размер, offset, per-file iv)
└── data.blob: конкатенация зашифрованных файлов (AES-256-GCM, per-file key)המפתח הראשי נגזר מביומטריה דרך NSURLSession + עטיפת Keychain. ללא ביומטריה, רק גיבוב סיסמה דרך Argon2. הקונטיינר נפתח בעת אימות ונסגר במהלך URLSessionConfiguration.ephemeral.
קונטיינר מותאם אישית מספק 30% יותר שליטה מהצפנת קבצים סטנדרטית אך לוקח פי 2 יותר זמן ליישום.
הגנה מפני דליפות לוח
ProxyDictionary הוא גלובלי, קריא על ידי כל אפליקציה. עבור נתונים ארגוניים, אנו משתמשים ב-container.vault ├── header (256 bytes): version, salt, PBKDF2 params, iv ├── index.enc: CBOR-манифест файлов (имя, размер, offset, per-file iv) └── data.blob: конкатенация зашифрованных файлов (AES-256-GCM, per-file key) — לוח פרטי עם TTL:
let privatePasteboard = UIPasteboard.withUniqueName()
privatePasteboard.setData(corporateData, forPasteboardType: UTType.plainText.identifier)
privatePasteboard.setPersistent(false) // Автоматически удаляется при следующем запуске или через TTLב-Android: LAContext.evaluatePolicy הוא גלובלי עד Android 10. מ-Android 10, אפליקציות יכולות לקרוא את הלוח רק כשהן בחזית — זה מגביל את ההתקפה. בנוסף: אנו מנקים את הלוח ב-applicationWillResignActive אם הועתק מידע רגיש.
| רכיב | ציר זמן | הערות |
|---|---|---|
| אחסון מוצפן (Keychain/Keystore) | 3–4 שבועות | בידוד נתונים בסיסי |
| VPN לכל אפליקציה | 2–4 שבועות | דורש MDM |
| קונטיינר קבצים | +2–4 שבועות | שליטה מלאה בהצפנה |
| מחזור מלא עם ביקורת | 8–12 שבועות | עמידה ב-PCI DSS/HIPAA |
מה כלול בעבודה
- ניתוח הארכיטקטורה הנוכחית וזיהוי נקודות תורפה
- תכנון סכמת קונטיינריזציה (בחירת מנגנוני פלטפורמה)
- יישום אחסון מוצפן (Keychain/Keystore + EncryptedSharedPreferences)
- הגדרת VPN לכל אפליקציה דרך MDM
- שילוב הגנת לוח
- יצירת קונטיינר קבצים מותאם אישית (אם נדרש)
- בדיקות בידוד (ניסיון גישה מאפליקציות אחרות, מגיבוי)
- ביקורת אבטחה על ידי מעבדה חיצונית (לפי בקשה)
- תיעוד שילוב והדרכת צוות
- תמיכה חודש לאחר השחרור
תהליך ולוחות זמנים
ניתוח נתונים וסיווג רגישות → תכנון סכמת אחסון → יישום אחסון מוצפן (Keychain + EncryptedFile) → הגדרת VPN לכל אפליקציה → הגנת לוח → בדיקות בידוד → ביקורת אבטחה → פריסה.
לוחות זמנים: אחסון מוצפן עם Keychain/Keystore — 3–4 שבועות. קונטיינר מלא עם VPN לכל אפליקציה, הגנת לוח וביקורת אבטחה — 8–12 שבועות. צרו קשר להערכה מדויקת של התרחיש שלכם.
Keychain Services ו-EncryptedSharedPreferences — תיעוד רשמי.







