CryptoKit 框架与 App 安全防护策略

WWDC2019 Session 709 : Cryptography and Your Apps

上面是 session 视频是 WWDC 关于密码学与 App 信息防护方面的一节 ,大概 40 min,整个视频分为两部分,重点介绍了在 App 的开发中,apple 针对用户信息安全方面所做的努力,以及全新的 swift 安全加密框架。

终于等到来官方的加密解密框架~还在等什么赶紧深入了解一下吧!!~~

全新的 Swift 安全加密框架 CryptoKit

初识 CryptoKit

你是否厌烦大量的 C Api 去进行加密解密?

你是否厌烦了每次 C Api 都要 开辟特定 size 的 buffer ?

你是否厌烦了在 C Api 里,为了类型安全以及 Null 判断,要编写大量繁重的代码?

你是否厌烦了在完成一整个加密解密操作后,还需要清零&释放 buffer ?

你是否厌烦了 C Api 下讨厌的内存管理?

那你还在等什么!快点拥抱最新的 CryptoKit 吧!

// Generating and releasing a cryptographic key for a C Crypto API
let keyByteCount = 256/8
var key = Array(repeating: 0, count: keyByteCount)
let err = SecRandomCopyBytes(kSecRandomDefault, keyByteCount, &key)
if (err != errSecSuccess) {
 // Safely handle the error
}
// Use the Key
...
// Zeroize the key
memset_s(&key, keyByteCount, 0, keyByteCount)

// ============================

// Generating and releasing a cryptographic key with Apple CryptoKit
let key = SymmetricKey(size: .bits256)

一行代码就是爽~ CryptoKit 顶呱呱!~

看看这代码对比差距,CryptoKit 不仅大幅度简化了 Api 的使用,还支持

  • 强类型的 Api 设计
  • 自动化的内存管理
  • 完善的一致性检验

CryptoKit 的架构设计与详解

CryptoKit 整体架构如图

  • Hash Function 哈希 Api
  • Symmetric-Key Cryptography 对称加密
  • Public-Key Cryptography 非对称加密
  • Insecure Module 不推荐使用的加密算法( MD5 ,SHA1 )

HASH API

let audioData = FileManager.default.contents(atPath: filePath)!
let digest = SHA256.hash(data: audioData)

以上便是一个最简单的 Hash 过程的 Api 示例,Hash 了一个 Data 文件~

对称加密解密

最基本的对称加密流程如下:

  • 服务器对数据进行对称加密
  • 密钥存储在客户端
  • 加密数据通过网络传输给客户端
  • 使用密钥解密还原数据
// Initialize the decryption key
let key = SymmetricKey(data: keyData)
// Initialize the sealed box
guard let sealedBox = ChaChaPoly.SealedBox(combined: downloadedData) else {
 throw MapDownloaderError.invalidDownload
}
// Open the sealed box (authenticates + decrypts)
let mapData = try ChaChaPoly.open(sealedBox, using: key)

上面就是一个客户端解密的过程,使用了 ChaChaPoly 这个比较新的加密算法,可以看到 API 封装了算法,用这个 CryptoKit 可以更方便的直接解密。其实框架还有很多其他现成可用的加解密算法框架,里面也包括我们最熟悉的 AES ~

非对称签名

除了对称加密解密,还有很重要的非对称签名也是被广泛运用在信息授权,数据防篡改上,在这块 CryptoKit 依然能很方便快捷的带你完成相关操作

非对称签名的整体流程大致如下

  • 手机生成私钥 + 公钥
  • 公钥保存在服务器
  • 用私钥 + 传输数据,生成签名
  • 签名&数据 发给服务器
  • 服务器用公钥验证签名
// Generate private key and register public key with server
let privateKey = P256.Signing.PrivateKey()
let publicKeyData = privateKey.publicKey.compactRepresentation!
// Store privateKey in Keychain
...
// Signing content
let signature = try privateKey.signature(for: transactionData)

上面的示例代码就向你展示了在客户端这一侧,如何使用 CryptoKit 的 Api ,生成私钥,生成公钥,对数据完成签名,代码非常的简洁~

用户授权与安全验证

不仅如此,在使用 CrytoKit 在对用户数据进行安全处理,加密解密的时候,还可以进一步使用 apple 的生物识别验证等能力,来保证用户在主动授权的情况下,才允许对数据进行加密与解密操作

```swift
let accessControl = SecAccessControlCreateWithFlags(nil,

top Created with Sketch.