1. Swift 与 Common Crypto 结合使用的最佳实践
密钥管理
- 生成密钥:
- 使用
Security.framework
中的 SecRandomCopyBytes
函数生成随机密钥。例如:
func generateKey(length: Int) -> Data? {
var keyData = Data(count: length)
let status = keyData.withUnsafeMutableBytes {
SecRandomCopyBytes(kSecRandomDefault, length, $0)
}
return status == errSecSuccess? keyData : nil
}
- 存储密钥:
- 对于敏感密钥,建议使用 iOS 设备的硬件加密存储,如 Keychain Services。可以使用
KeychainAccess
库来简化操作。例如:
let keychain = Keychain(service: "com.example.app")
let key = generateKey(length: 32)
if let key = key {
try? keychain.set(key, key: "encryptionKey")
}
- 密钥更新:
- 定期更新密钥以增强安全性。在更新密钥时,需要同时对存储的数据进行重新加密。
数据加密与解密流程
- 加密:
- 导入
CommonCrypto
框架。以 AES - 256 加密为例:
import CommonCrypto
func encrypt(data: Data, key: Data, iv: Data) -> Data? {
var encryptedData = Data(count: data.count + kCCBlockSizeAES128)
var numBytesEncrypted: size_t = 0
let keyLength = size_t(kCCKeySizeAES256)
let operation: CCOperation = UInt32(kCCEncrypt)
let algorithm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionPKCS7Padding)
let status = encryptedData.withUnsafeMutableBytes { encryptedBytes in
data.withUnsafeBytes { dataBytes in
key.withUnsafeBytes { keyBytes in
iv.withUnsafeBytes { ivBytes in
CCCrypt(operation, algorithm, options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, encryptedBytes.baseAddress, encryptedData.count, &numBytesEncrypted)
}
}
}
}
if status == kCCSuccess {
encryptedData.count = Int(numBytesEncrypted)
return encryptedData
}
return nil
}
func decrypt(data: Data, key: Data, iv: Data) -> Data? {
var decryptedData = Data(count: data.count)
var numBytesDecrypted: size_t = 0
let keyLength = size_t(kCCKeySizeAES256)
let operation: CCOperation = UInt32(kCCDecrypt)
let algorithm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionPKCS7Padding)
let status = decryptedData.withUnsafeMutableBytes { decryptedBytes in
data.withUnsafeBytes { dataBytes in
key.withUnsafeBytes { keyBytes in
iv.withUnsafeBytes { ivBytes in
CCCrypt(operation, algorithm, options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, decryptedBytes.baseAddress, decryptedData.count, &numBytesDecrypted)
}
}
}
}
if status == kCCSuccess {
decryptedData.count = Int(numBytesDecrypted)
return decryptedData
}
return nil
}
2. 实际应用中的安全挑战及应对策略
针对不同设备性能的优化
- 挑战:不同 iOS 设备的硬件性能存在差异,加密和解密操作可能会对性能产生影响,尤其是在处理大量数据时。
- 策略:
- 异步处理:将加密和解密操作放在后台队列中执行,避免阻塞主线程。例如使用
DispatchQueue.global(qos:.background).async
。
- 优化算法:对于性能较低的设备,可以考虑使用更轻量级的加密算法,如 ChaCha20,它在某些情况下性能优于 AES。
抵御中间人攻击
- 挑战:中间人攻击者可能拦截、篡改或伪造通信数据。
- 策略:
- 证书固定:在应用中固定服务器的证书,防止攻击者使用伪造的证书进行中间人攻击。可以通过在应用中硬编码证书的哈希值,在建立连接时验证服务器证书的哈希是否匹配。
- 使用 HTTPS:确保所有网络通信都使用 HTTPS 协议,利用 SSL/TLS 协议的加密和身份验证机制来保护通信安全。
- 密钥交换:使用安全的密钥交换协议,如 Diffie - Hellman 密钥交换,在通信双方之间安全地交换加密密钥,防止密钥在传输过程中被窃取。