0Pricing
Swift Academy · Урок

Защита данных и шифрование

Защищайте файлы и изучите основы 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 — локальная установка не требуется.

Все уроки этого курса

  1. Хранение секретов в связке ключей
  2. Управление доступом к связке ключей
  3. Биометрическая аутентификация
  4. Защита данных и шифрование
← Назад к Swift Academy