0Pricing
Swift Academy · 课时

数据保护与加密

保护文件并学习 CryptoKit 基础知识。

数据保护与加密 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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])
}

设置现有文件的保护

创建文件后,您可以通过 FileManager 设置 FileAttributeKey.protectionKey 属性来更改文件的保护级别。对于您接收或迁移的文件,这种方式非常适合用来加强保护。

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

使用 CryptoKit 进行应用内加密

当您需要自行加密数据时——例如在上传数据之前,或在磁盘保护之上增加一层保护——请使用 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()
}

对称密钥

对称加密使用一个共享密钥。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 来派生密钥。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)
}

构建多层防御

安全性较强的应用会组合多层防御:数据保护会根据锁定状态加密静态文件,钥匙串会在生物识别之后才释放密钥,而 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生成,以及通过seal/open实现的 AES-GCM 认证加密。
  • 使用 HKDF 派生密钥;将密钥存储在钥匙串中,绝不要与密文放在一起。
  • 结合使用数据保护、钥匙串和 CryptoKit,构建纵深防御。

常见问题解答

「数据保护与加密」课时是免费的吗?

是的 — 「数据保护与加密」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「数据保护与加密」这节课中我会学到什么?

保护文件并学习 CryptoKit 基础知识。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「数据保护与加密」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 在钥匙串中存储机密
  2. 钥匙串访问控制
  3. 生物识别身份验证
  4. 数据保护与加密
← 返回 Swift Academy