Table of Contents
了解iOS上的数据加密
iOS在多个层次上执行加密以保护敏感数据. 在硬件层面,安全隐蔽器管理加密密钥和加密操作. 在操作系统层面, Data保护[ 使用文件级别加密,将解密密密钥与设备的密码连接起来. 对于应用特定数据,开发者可以借助CryptoKit,CommonCrypto,安全框架等框架加密个人记录,文件或网络有效载荷.
加密使用算法和密钥将纯文本转换为密码文本。 没有正确的密钥, 数据仍然无法读取。 苹果的 [[FLT: 0]] iOS数据保护 API [[[FLT: 1]] 自动加密文件, 但开发者需要明确加密存储在受保护文件系统外的数据—— 如Core Data、 UserDefaults 或自定义缓存中的数据 。
密钥取走: [[FLT: 0]] 加密敏感数据, 每当它停留在设备上时[[[FLT: 1]], 即使iOS加密默认是允许的。 这保证了保护, 防止物理设备访问、 法医提取或恶意应用程序在同一沙盒中运行。
iOS 加密框架和 API
苹果提供了几个密码库。 选择正确的库取决于部署目标和所需的控制水平。
CryptoKit – 现代 Swift API 密码
iOS 13 中引入 CryptoKit 提供了对称和不对称加密、散列和密钥协议的 Swift-native 接口。 它使用 AES-GCM 进行认证加密,既保护保密性又保护完整性。下面是典型的加密和解密模式 :
import CryptoKit
func encryptSensitiveData(_ plaintext: String, using key: SymmetricKey) throws -> Data {
let inputData = Data(plaintext.utf8)
let sealedBox = try AES.GCM.seal(inputData, using: key)
return sealedBox.combined
}
func decryptSensitiveData(_ encryptedData: Data, using key: SymmetricKey) throws -> String {
let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)
let decryptedData = try AES.GCM.open(sealedBox, using: key)
return String(decoding: decryptedData, as: UTF8.self)
}
总是将 [[FLT: 1]] 存储在密钥链中, 而不是在用户默认或普通文件中。 使用 [[[FLT: 2]] 与 绑定密钥与设备及用户的存在 。
常用晶格 – C 弹性
对于支持较旧的iOS版本或需要自定义块密码模式(例如带有HMAC的CBC)的应用程序,CommonCrypto提供低级C函数. 它支持AES,DES,3DES,以及各种散列算法. AES-CBC加密的例子:
#include <CommonCrypto/CommonCryptor.h>
- (NSData *)aes256Encrypt:(NSData *)plaintext withKey:(NSData *)key iv:(NSData *)iv {
size_t outLength;
NSMutableData *ciphertext = [NSMutableData dataWithLength:plaintext.length + kCCBlockSizeAES128];
CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
key.bytes, key.length, iv.bytes,
plaintext.bytes, plaintext.length,
ciphertext.mutableBytes, ciphertext.length,
&outLength);
if (status == kCCSuccess) {
ciphertext.length = outLength;
return ciphertext;
}
return nil;
}
Centrypto 需要人工管理初始化矢量(IV)和认证标记. 对于认证的加密,配对 AES-CBC 并配有单独的 HMAC,或者在可能的情况下通过 CryptoKit 切换到 AES-GCM .
安全框架和钥匙链
安全框架为密钥、证书和密码的安全存储提供密钥链服务。使用 存储密钥,并严格控制访问(例如,要求用户通过生物鉴别技术存在 ) 。 安全飞地可以生成和存储用于ECC操作的私人密钥,确保密钥永远不离开硬件 。
执行不同数据类型的加密
并非所有数据都需要同样的加密策略。 调整数据使用方式和地点。 Name
加密用户默认和核心数据
用户默认和核心数据存储是普通的 SQLite 文件, 除非加密。 对于核心数据, 启用存储文件中的 [[FLT: 0]] NSFile 保护Type [[[FLT: 1] 属性。 对于细颗粒性, 在保存前先加密单个属性或整个对象 :
- 使用核心数据可变 属性,并带有自定义值变压器,在读/写上加密/解密.
- 将整个管理对象序列化为JSON,加密,并将密码文本存储在二进制属性中.
- 对于用户默认,永远不要存储原始敏感字符串;加密每个值并存储加密数据.
在用户默认中存储加密数据的例子 :
let key = SymmetricKey(size: .bits256)
let data = "user_ssn".data(using: .utf8)!
let sealedBox = try AES.GCM.seal(data, using: key)
UserDefaults.standard.set(sealedBox.combined, forKey: "encrypted_ssn")
UserDefaults.standard.synchronize()
使用文件保护加密文件
iOS 提供文件级别保护类: , ,和 。在创建或移动文件时设置这些属性 :
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)
如果数据必须保留保护, 则将文件保护与明确的加密相结合。 例如, 用密钥加密文件, 并存储在密钥链中, 且只能在认证后才能访问 。
加密网络数据(运输层安全)
App Transport Security (ATS) 默认执行 HTTPS 。 对于自定义的 TCP 连接, 请使用 [[FLT: 11] ] , 使用 TLS 或执行 SSL 定点针来防止中层人的攻击。 加密应用程序层的有效载荷以进行额外的深入防御: 即使 TLS 已失密, 数据仍然受到保护 。
主要管理最佳做法
加密只和关键管理一样强大。遵循这些准则来维护安全:
- 使用加密安全随机数生成器[ –使用或[]]的生成键。
- 完全在键链 中安装有适当的可访问属性:[]] 防止备份,并将键与设备连接起来.
- 在检索密钥-]前使用生物鉴别或密码认证[],并使用强制用户验证.
- 在安全事件 时刻表或之后旋转密钥 – 用新密钥重新加密数据,并安全删除旧密钥.
- 在源代码或配置文件中不使用硬码密钥. 必要时使用慢键衍生函数(PBKDF2或scrypt)从用户密码中提取的密钥.
- 为不对称密钥生成——不能导出私人密钥,防止过滤,使用安全密钥[].
对于处理高度敏感数据的应用程序,考虑通过网络服务使用硬件安全模块[,尽管这引入了延迟性,需要互联网连接.
密钥旋转和重加密
当一个密钥被损坏或被设定的期间(例如每90天)后, 将密钥旋转。 这涉及用旧密钥解密所有数据, 生成新密钥, 并重新加密。 对于大型数据集, 执行一个版本密钥方案 :
- 在每个加密记录旁存储一个密钥标识符(例如UUID).
- 保持将标识符映射到键链中的实际密钥(在休息时加密).
- 在旋转时, 添加新条目, 而不立即重新加密所有数据。 访问时重新加密为懒惰 。
遵约和监管考虑
许多法规都规定敏感数据的加密。 GDPR 需要适当的技术措施,加密是一种公认的假名化技术。 HIPAA 授权在休息和过境时对ePHI进行加密。 PCI DSS[ 需要对持卡人数据进行加密。在iOS中,遵循苹果公司的《数据保护准则》,加上应用层加密,满足了大多数的合规要求。记录您的加密执行情况、关键生命周期政策和审计线索,以供监管机构审查。
参考苹果公司关于最新建议的正式文件:[ 计算机开发商指南, 关键链服务,和[ 保护用户隐私. 行业指导,见[ OWASP移动安全测试指南[和[ NIST SP 800-175B – 加密标准.
测试和验证
执行加密后,验证其工作正确:
- 写入单位测试, 加密和解密已知的纯文本并维护输出 。
- 测试边缘箱:空数据,非常大的有效载荷,以及腐烂的密码.
- 使用断层设备进行安全测试,模拟攻击情景——核实没有认证钥匙仍然无法进入。
- 使用静态分析工具,确保没有硬码密钥或弱算法.
- Review logs – 永远不要日志纯文本敏感数据或加密密钥.
结论
实施敏感iOS数据存储的数据加密是一个多层次的过程. 通过将iOS文件保护,应用程序层加密与CryptoKit或CommonCrypto相结合,并通过Keychain和Safe Enclave严格密钥管理,开发者可以大幅降低数据曝光的风险. 遵守GDPR和HIPAA等法规需要有文件可审核的加密做法. 定期测试和密钥旋转确保长期安全. 投资强大的加密架构不仅保护用户数据,而且建立信任并满足监管预期.