Swift中的密码学:iOS/macOS的加密与哈希

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐