数据保护与加密
保护文件并学习 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 反馈 — 无需本地设置。