Защита данных и шифрование
Защищайте файлы и изучите основы CryptoKit.
«Защита данных и шифрование» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
Защита данных в iOS
iOS по умолчанию шифрует файлы на диске, но Вы можете выбрать когда содержимое файла можно расшифровать, используя классы Защиты данных. Они связывают доступ к файлу с состоянием блокировки устройства, подобно тому как классы доступности Связки ключей защищают секреты.
import Foundation
// File-level protection ties decryption to lock state.
// Set a protection class when writing sensitive files.Классы защиты
Основные уровни защиты файлов: .complete (недоступен для чтения при блокировке), .completeUnlessOpen (остаётся доступным для чтения, если уже был открыт в момент блокировки), .completeUntilFirstUserAuthentication (доступен для чтения после первой разблокировки) и .none.
import Foundation
// FileProtectionType:
// .complete
// .completeUnlessOpen
// .completeUntilFirstUserAuthentication (default)
// .none
let level = FileProtectionType.complete
_ = levelЗапись защищённого файла
Передайте .completeFileProtection в параметры записи, чтобы отметить файл как полностью защищённый. Пока устройство заблокировано, OS делает его содержимое недоступным даже для собственного приложения.
import Foundation
func writeSecure(_ data: Data, to url: URL) throws {
try data.write(
to: url,
options: [.completeFileProtection])
}Настройка защиты существующих файлов
После создания можно изменить защиту файла, задав атрибут FileAttributeKey.protectionKey через FileManager. Это удобно для усиления защиты файлов, которые Вы получаете или переносите.
import Foundation
func protect(_ url: URL) throws {
try FileManager.default.setAttributes(
[.protectionKey: FileProtectionType.complete],
ofItemAtPath: url.path)
}CryptoKit для шифрования внутри приложения
Если Вам нужно самостоятельно зашифровать данные — перед загрузкой или чтобы добавить уровень защиты поверх защиты диска — используйте CryptoKit. Он предоставляет современные примитивы, устойчивые к неправильному использованию, с безопасными настройками по умолчанию и без ручного управления векторами инициализации для шифров AEAD.
import CryptoKit
// CryptoKit offers hashing, symmetric & public-key
// crypto with safe, hard-to-misuse APIs.Хеширование с помощью SHA-256
Для проверки целостности и создания отпечатков SHA256 создаёт дайджест фиксированного размера. Помните, что хеширование необратимо и не заменяет шифрование: никогда не хешируйте пароль без соли и медленного KDF.
import CryptoKit
import Foundation
func fingerprint(_ data: Data) -> String {
let digest = SHA256.hash(data: data)
return digest.map { String(format: "%02x", $0) }
.joined()
}Симметричные ключи
При симметричном шифровании используется один общий ключ. SymmetricKey(size: .bits256) создаёт надёжный случайный ключ. Храните ключ в Связке ключей — никогда не размещайте его рядом с защищаемым шифртекстом.
import CryptoKit
let key = SymmetricKey(size: .bits256)
// Persist this key in the Keychain, not in a file.
_ = keyШифрование с помощью AES-GCM
AES.GCM выполняет аутентифицированное шифрование: оно одновременно шифрует данные и обнаруживает их изменение. seal возвращает запечатанный контейнер, в котором вместе находятся шифртекст, одноразовое значение и тег аутентификации.
import CryptoKit
import Foundation
func encrypt(_ data: Data, key: SymmetricKey)
throws -> Data {
let sealed = try AES.GCM.seal(data, using: key)
return sealed.combined! // nonce + ciphertext + tag
}Расшифровка и проверка
Для расшифровки восстановите SealedBox из объединённых данных и вызовите open. Если шифртекст или тег были изменены, open выдаёт ошибку — тег аутентификации гарантирует целостность, поэтому повреждённые данные никогда не расшифровываются незаметно.
import CryptoKit
import Foundation
func decrypt(_ combined: Data, key: SymmetricKey)
throws -> Data {
let box = try AES.GCM.SealedBox(combined: combined)
return try AES.GCM.open(box, using: key)
}Получение ключей из паролей
Никогда не используйте исходный пароль как ключ. Получите ключ с помощью HKDF для входных данных с высокой энтропией или парольного KDF. HKDF расширяет и добавляет соль к материалу ключа, превращая его в подходящий симметричный ключ.
import CryptoKit
import Foundation
func deriveKey(from secret: Data, salt: Data)
-> SymmetricKey {
return HKDF<SHA256>.deriveKey(
inputKeyMaterial: SymmetricKey(data: secret),
salt: salt,
outputByteCount: 32)
}Многоуровневая защита
Надёжные приложения сочетают несколько уровней защиты: Защита данных шифрует файлы в состоянии покоя, связывая их с состоянием блокировки; Связка ключей защищает ключи с помощью биометрии; CryptoKit добавляет шифрование на уровне приложения для данных при передаче или в облаке. Каждый уровень по отдельности безопасно обрабатывает сбои.
import CryptoKit
import Foundation
// 1. Key lives in Keychain (biometric-gated)
// 2. Plaintext file written with .completeFileProtection
// 3. Uploads encrypted with AES.GCM before leaving device
let layers = "defense in depth"
_ = layersБыстрая проверка
Вспомните, почему AES-GCM предпочитают для шифрования на уровне приложения.
Повторение
Вы изучили защиту данных и шифрование:
- Классы защиты данных для файлов (
.complete,.completeUntilFirstUserAuthentication) связывают расшифрование данных на диске с состоянием блокировки. - CryptoKit предоставляет хеширование SHA-256, создание
SymmetricKeyи аутентифицированное шифрование AES-GCM с помощьюseal/open. - Выводите ключи с помощью HKDF; храните ключи в связке ключей, а не рядом с зашифрованными данными.
- Используйте защиту данных, связку ключей и CryptoKit послойно для эшелонированной защиты.
Часто задаваемые вопросы
Урок «Защита данных и шифрование» бесплатный?
Да — полный текст урока «Защита данных и шифрование» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Защита данных и шифрование»?
Защищайте файлы и изучите основы CryptoKit. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Защита данных и шифрование»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Хранение секретов в связке ключей
- Управление доступом к связке ключей
- Биометрическая аутентификация
- Защита данных и шифрование