Civil &: строительная инженерия
Внедрение шифрования данных для чувствительного хранения данных Ios
Table of Contents
Понимание шифрования данных на 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 дней), поверните ключ. Это включает в себя расшифровку всех данных старым ключом, генерацию нового ключа и повторное шифрование. Для больших наборов данных реализуйте версифицированную схему ключа:
- Храните идентификатор ключа (например, UUID) рядом с каждой зашифрованной записью.
- Сохраните отображение идентификаторов на фактические ключи в Keychain (зашифрованные в состоянии покоя).
- Во время ротации добавьте новую запись без немедленного повторного шифрования всех данных.
Соответствие и нормативные соображения
Многие правила предписывают шифрование для конфиденциальных данных. GDPR требует соответствующих технических мер, а шифрование является признанной техникой псевдонимизации. HIPAA предписывает шифрование ePHI в покое и в пути. PCI DSS требует шифрования данных держателя карты. В iOS следование рекомендациям Apple по защите данных в сочетании с шифрованием на уровне приложений удовлетворяет большинству требований соответствия. Документируйте реализацию шифрования, ключевые политики жизненного цикла и аудиторские маршруты для проверки регулятора.
См. официальную документацию Apple для последних рекомендаций: Руководство для разработчиков CryptoKit , Услуги для цепочек и Защита конфиденциальности пользователей . Для руководства по отрасли см. Руководство по тестированию мобильной безопасности OWASP и NIST SP 800-175B — Криптографические стандарты .
Тестирование и валидация
После внедрения шифрования убедитесь, что оно работает правильно:
- Напишите единичные тесты, которые шифруют и расшифровывают известные простые тексты и утверждают выходы.
- Тестовые крайние случаи: пустые данные, очень большие полезные нагрузки и поврежденные шифротексты.
- Проведите тестирование безопасности с использованием взломанного устройства для имитации сценариев атаки — убедитесь, что ключи остаются недоступными без аутентификации.
- Используйте инструменты статического анализа, чтобы не иметь жестких ключей или слабых алгоритмов.
- Журналы обзора - никогда не регистрируйте конфиденциальные данные или ключи шифрования в открытом тексте.
Заключение
Внедрение шифрования данных для чувствительного хранения данных iOS является многоуровневым процессом. Объединив защиту файлов iOS, шифрование прикладного уровня с CryptoKit или CommonCrypto и строгое управление ключами через Keychain и Secure Enclave, разработчики могут значительно снизить риск воздействия данных. Соблюдение правил, таких как GDPR и HIPAA, требует документированных, проверенных практик шифрования. Регулярное тестирование и ротация ключей обеспечивают долгосрочную безопасность. Инвестирование в надежную архитектуру шифрования не только защищает данные пользователей, но и создает доверие и отвечает нормативным ожиданиям.