Swift中的密码学(iOS/macOS):加密与哈希
数据安全是iOS和macOS开发的关键方面。Swift提供了强大的密码学保护工具:从内置框架CryptoKit(自iOS 13 / macOS 10.15起)到底层CommonCrypto(C语言库)。在本文中,我们将介绍基本操作:对称加密(AES)、非对称加密(RSA)、哈希(SHA-256)和消息认证(HMAC)。
1. 项目配置
使用CryptoKit无需额外配置——它包含在标准Foundation库中。如果您使用CommonCrypto,请在Bridging-Header中添加(适用于Swift + ObjC)或直接导入模块:
// 在Swift 5+中使用CommonCrypto,可以:import CommonCrypto// 或配置模块桥接(modulemap)2. 使用CryptoKit进行对称加密(AES-GCM)
CryptoKit为AES的GCM模式(Galois/Counter Mode)提供了高级API——一种安全且简单的加密方式。
import CryptoKitimport Foundation
// 字符串加密函数func encryptString(_ plaintext: String, using key: SymmetricKey) throws -> Data { let plaintextData = plaintext.data(using: .utf8)! let sealedBox = try AES.GCM.seal(plaintextData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
// 解密函数func decryptData(_ combinedData: Data, using key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: combinedData) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// 使用示例let key = SymmetricKey(size: .bits256) // 256位密钥let original = "iOS的秘密消息"let encrypted = try encryptString(original, using: key)print("已加密: \\(encrypted.base64EncodedString())")
let decrypted = try decryptData(encrypted, using: key)print("已解密: \\(decrypted)")重要提示:SymmetricKey是随机生成的。对于实际应用,密钥应存储在Keychain中或使用Secure Enclave。
3. 哈希(SHA-256)和HMAC
哈希是一种单向函数,对于验证数据完整性和存储密码至关重要。CryptoKit支持SHA-256、SHA-384、SHA-512。
import CryptoKit
func sha256Hash(of data: Data) -> String { let digest = SHA256.hash(data: data) return digest.compactMap { String(format: "%02x", $0) }.joined()}
// 字符串示例let message = "你好,Swift密码学!"let hash = sha256Hash(of: message.data(using: .utf8)!)print("SHA-256: \\(hash)")对于消息认证(HMAC),使用带密钥的HMAC:
func hmacSHA256(key: SymmetricKey, data: Data) -> Data { let authenticationCode = HMAC<SHA256>.authenticationCode(for: data, using: key) return Data(authenticationCode)}
let hmacKey = SymmetricKey(size: .bits256)let hmacResult = hmacSHA256(key: hmacKey, data: "重要数据".data(using: .utf8)!)print("HMAC: \\(hmacResult.base64EncodedString())")4. 通过Security框架进行非对称加密(RSA)
对于RSA,请使用Security框架(SecKey)。CryptoKit不直接支持RSA,但您可以组合使用不同方法。
import Security
// 生成RSA密钥对(2048位)func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kS