Swift Academy · レッスン

データ保護と暗号化

ファイルを保護し、CryptoKitの基本を学びます。

レッスン 4/413 ステップ

「データ保護と暗号化」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

iOSのデータ保護

iOSはデフォルトでディスク上のファイルを暗号化しますが、Data Protectionクラスを使って、ファイルの内容をいつ復号可能にするかを選択できます。これは、Keychainのアクセシビリティクラスがシークレットに対して行うのと同様に、ファイルへのアクセスをデバイスのロック状態と結び付けます。

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])
}

既存ファイルへの保護設定

作成後のファイルでも、FileManagerを通じてFileAttributeKey.protectionKey属性を設定することで、保護レベルを変更できます。受け取ったファイルや移行したファイルの保護を強化する場合に便利です。

import Foundation
func protect(_ url: URL) throws {
    try FileManager.default.setAttributes(
        [.protectionKey: FileProtectionType.complete],
        ofItemAtPath: url.path)
}

アプリ内暗号化のためのCryptoKit

アップロード前にデータを自分で暗号化したい場合や、ディスク保護にもう1層追加したい場合は、CryptoKitを使用してください。安全なデフォルト値を備えた、現代的で誤用に強いプリミティブを提供し、AEAD暗号でIVを手動管理する必要もありません。

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()
}

対称鍵

対称暗号では、1つの共有鍵を使用します。SymmetricKey(size: .bits256)は強力なランダム鍵を生成します。鍵はKeychainに保存し、保護対象の暗号文と一緒に保存してはいけません。

import CryptoKit
let key = SymmetricKey(size: .bits256)
// Persist this key in the Keychain, not in a file.
_ = key

AES-GCMによる暗号化

AES.GCMは認証付き暗号です。データを暗号化すると同時に、改ざんも検出します。sealは、暗号文、nonce、認証タグをまとめたsealed boxを返します。

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を使って鍵を導出してください。CryptoKitの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)
}

防御の多層化

堅牢なアプリは複数の層を組み合わせます。Data Protectionはロック状態と結び付いた保存データのファイルを暗号化し、Keychainは生体認証で鍵を保護し、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がアプリレベルの暗号化で推奨される理由を思い出してください。

まとめ

データ保護と暗号化について学びました。

  • ファイルのData Protectionクラス(.complete、.completeUntilFirstUserAuthentication)は、ディスクの復号をロック状態に結び付けます。
  • CryptoKitは、SHA-256ハッシュ、SymmetricKeyの生成、seal/openによるAES-GCM認証付き暗号化を提供します。
  • HKDFで鍵を導出し、鍵はKeychainに保存してください。暗号文の隣に保存してはいけません。
  • Data Protection、Keychain、CryptoKitを組み合わせて多層防御を実現します。
無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「データ保護と暗号化」レッスンは無料ですか?

はい。「データ保護と暗号化」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「データ保護と暗号化」で何を学びますか?

ファイルを保護し、CryptoKitの基本を学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「データ保護と暗号化」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Keychainへの秘密情報の保存
  2. Keychainのアクセス制御
  3. 生体認証
  4. データ保護と暗号化
← Swift Academyに戻る