Понимание шифрования данных на iOS

iOS реализует шифрование на нескольких уровнях для защиты конфиденциальных данных. На аппаратном уровне Secure Enclave управляет ключами шифрования и криптографическими операциями. На уровне операционной системы Защита данных использует шифрование на уровне файлов, которое связывает ключи дешифрования с паролем устройства. Для данных, относящихся к конкретным приложениям, разработчики могут использовать такие фреймворки, как CryptoKit, CommonCrypto и фреймворк Security для шифрования отдельных записей, файлов или сетевых полезных нагрузок.

Шифрование преобразует простой текст в шифротекст с использованием алгоритма и ключа. Без правильного ключа данные остаются нечитаемыми. API защиты данных Apple iOS автоматически шифрует файлы в состоянии покоя, но разработчикам необходимо явное шифрование для данных, хранящихся за пределами защищенной файловой системы, например, в основных данных, пользовательских по умолчанию или пользовательских кэшах.

Ключевой вывод: шифровать конфиденциальные данные всякий раз, когда они находятся на устройстве , даже если шифрование iOS включено по умолчанию. Это обеспечивает защиту от доступа к физическому устройству, криминалистической экстракции или вредоносных приложений, работающих в той же песочнице.

iOS Encryption Frameworks и API

Apple предоставляет несколько криптографических библиотек.Выбор правильной зависит от цели развертывания и требуемого уровня управления.

CryptoKit — современный API Swift

Введенный в iOS 13, CryptoKit предлагает Swift-нативный интерфейс для симметричной и асимметричной криптографии, хеширования и ключевого соглашения. Он использует 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)
}

Всегда храните в брелоке ключей, а не в UserDefaults или простом файле. Используйте с , чтобы привязать ключ к устройству и присутствию пользователя.

CommonCrypto — C-Based Flexibility (Гибкость на основе C)

Для приложений, поддерживающих более старые версии iOS или требующих пользовательских режимов блочного шифра (например, CBC с HMAC), CommonCrypto предоставляет низкоуровневые функции C. Он поддерживает AES, DES, 3DES и различные алгоритмы хеширования. Пример шифрования AES-CBC:

#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 требует ручного управления векторами инициализации (IV) и тегами аутентификации.Для аутентифицированного шифрования по возможности подключайте AES-CBC с отдельным HMAC или переключайтесь на AES-GCM через CryptoKit.

Система безопасности и Keychain

Система безопасности предоставляет услуги Keychain для безопасного хранения ключей, сертификатов и паролей. Используйте для хранения ключей со строгим контролем доступа (например, требуется присутствие пользователя через биометрию). Secure Enclave может генерировать и хранить закрытые ключи для операций ECC, гарантируя, что ключ никогда не покидает оборудование.

Внедрение шифрования для различных типов данных

Не все данные нуждаются в одной и той же стратегии шифрования. Подход к тому, как и где используются данные.

Шифрование пользовательских по умолчанию и основных данных

UserDefaults и Core Data Stores являются простыми SQLite файлами, если они не зашифрованы. Для Core Data включите атрибут NSFileProtectionType в файле магазина. Для более тонкой детализации зашифровайте отдельные атрибуты или целые объекты перед сохранением:

  • Используйте атрибуты Core Data , трансформируемые , с пользовательским преобразователем значений, который шифрует / расшифровывает на чтение / запись.
  • Сериализируйте весь управляемый объект как 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()

Шифрование файлов с помощью защиты файлов

iOS предлагает классы защиты на уровне файлов: , и . Установите эти атрибуты при создании или перемещении файлов:

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

Объедините защиту файлов с явным шифрованием, если данные должны оставаться защищенными даже при разблокировке устройства. Например, зашифровайте файл с ключом, хранящимся в Keychain, и доступным только после аутентификации.

Шифрование сетевых данных (безопасность транспортного уровня)

Приложение Transport Security (ATS) обеспечивает соблюдение HTTPS по умолчанию. Для пользовательских TCP-соединений используйте с TLS или реализуйте SSL-пиннинг для предотвращения атак типа «человек посередине». Шифруйте полезную нагрузку на уровне приложения для дополнительной защиты: даже если TLS скомпрометирован, данные остаются защищенными.

Ключевые управленческие лучшие практики

Шифрование настолько же сильно, как и управление ключами. Следуйте этим рекомендациям для поддержания безопасности:

  • Генерировать ключи с помощью криптографически безопасного генератора случайных чисел — Используйте или .
  • Ключи для хранения исключительно в Keychain с соответствующими атрибутами доступности: предотвращает резервное копирование и связывает ключ с устройством.
  • Использовать биометрическую аутентификацию или аутентификацию пароля перед извлечением ключа — с силами проверки пользователя.
  • Вращайте ключи по расписанию или после события безопасности — повторно шифруйте данные новыми ключами и безопасно удаляйте старые ключи.
  • Не закодируйте ключи в исходном коде или конфигурационных файлах. При необходимости извлекайте ключи из паролей пользователя с помощью функции медленного вывода ключа (PBKDF2 или scrypt).
  • Используйте безопасный анклав для генерации асимметричных ключей — приватные ключи не могут быть экспортированы, предотвращая эксфильтрацию.

Для приложений, обрабатывающих высокочувствительные данные, рассмотрите возможность использования аппаратного модуля безопасности (HSM) через сетевые службы, хотя это вводит задержку и требует подключения к Интернету.

Вращение ключей и повторное шифрование

Когда ключ скомпрометирован или после определенного периода (например, каждые 90 дней), поверните ключ. Это включает в себя расшифровку всех данных старым ключом, генерацию нового ключа и повторное шифрование. Для больших наборов данных реализуйте версифицированную схему ключа:

  1. Храните идентификатор ключа (например, UUID) рядом с каждой зашифрованной записью.
  2. Сохраните отображение идентификаторов на фактические ключи в Keychain (зашифрованные в состоянии покоя).
  3. Во время ротации добавьте новую запись без немедленного повторного шифрования всех данных.

Соответствие и нормативные соображения

Многие правила предписывают шифрование для конфиденциальных данных. GDPR требует соответствующих технических мер, а шифрование является признанной техникой псевдонимизации. HIPAA предписывает шифрование ePHI в покое и в пути. PCI DSS требует шифрования данных держателя карты. В iOS следование рекомендациям Apple по защите данных в сочетании с шифрованием на уровне приложений удовлетворяет большинству требований соответствия. Документируйте реализацию шифрования, ключевые политики жизненного цикла и аудиторские маршруты для проверки регулятора.

См. официальную документацию Apple для последних рекомендаций: Руководство для разработчиков CryptoKit , Услуги для цепочек и Защита конфиденциальности пользователей . Для руководства по отрасли см. Руководство по тестированию мобильной безопасности OWASP и NIST SP 800-175B — Криптографические стандарты .

Тестирование и валидация

После внедрения шифрования убедитесь, что оно работает правильно:

  • Напишите единичные тесты, которые шифруют и расшифровывают известные простые тексты и утверждают выходы.
  • Тестовые крайние случаи: пустые данные, очень большие полезные нагрузки и поврежденные шифротексты.
  • Проведите тестирование безопасности с использованием взломанного устройства для имитации сценариев атаки — убедитесь, что ключи остаются недоступными без аутентификации.
  • Используйте инструменты статического анализа, чтобы не иметь жестких ключей или слабых алгоритмов.
  • Журналы обзора - никогда не регистрируйте конфиденциальные данные или ключи шифрования в открытом тексте.

Заключение

Внедрение шифрования данных для чувствительного хранения данных iOS является многоуровневым процессом. Объединив защиту файлов iOS, шифрование прикладного уровня с CryptoKit или CommonCrypto и строгое управление ключами через Keychain и Secure Enclave, разработчики могут значительно снизить риск воздействия данных. Соблюдение правил, таких как GDPR и HIPAA, требует документированных, проверенных практик шифрования. Регулярное тестирование и ротация ключей обеспечивают долгосрочную безопасность. Инвестирование в надежную архитектуру шифрования не только защищает данные пользователей, но и создает доверие и отвечает нормативным ожиданиям.