专栏首页ios技术安装iOS开发之CryptoKit
原创

iOS开发之CryptoKit

Apple 在 WWDC2019 推出了一个基于 Swift 的密码框架 CryptoKit,它让生成哈希值、加/解密数据、数字签名和密钥协商变得更加容易。

阅读本文前,需要有一定的密码学基础。请参考之前的一篇文章搞定密码学基础一文。

哈希值

  • 提供了 3 种 Hash 函数:
    • SHA256
    • SHA384
    • SHA512
  • 哈希普通的 Data 类型的数据
let str = "Hello CryptoKit"
let data = str.data(using: .utf8)!

let hash256 = SHA256.hash(data: data)
let hash384 = SHA384.hash(data: data)
let hash512 = SHA512.hash(data: data)

print(hash256.description)复制代码
  • 哈希文件
if let filePath = Bundle.main.path(forResource: "secret", ofType: "json"),
    let data = FileManager.default.contents(atPath: filePath) {

    let hash256 = SHA256.hash(data: data)
    let hash384 = SHA384.hash(data: data)
    let hash512 = SHA512.hash(data: data)

    print(hash256.description)
}复制代码

HMAC

HMAC 可以理解为一种更安全的 Hash,它需要借助于前面介绍的 Hash 函数。

// 构造一个salt
let salt = "YungFan".data(using: .utf8)!

// 密钥
let key = SymmetricKey(size: .bits256)

// HMAC with SHA256
let authenticationCode = HMAC<SHA256>.authenticationCode(for: salt, using: key)
print(authenticationCode)

// 验证
if HMAC<SHA256>.isValidAuthenticationCode(Data(authenticationCode),
                                          authenticating: salt, using: key) {
    print("未被篡改")
}复制代码

加解密数据

支持 AES-GCM 和 ChaChaPoly 算法。开发中首选 ChaChaChaPoly,因为按照官方宣称它在移动设备上的速度更快。ChaChaChaPoly 中的核心概念是ChaChaChaPoly.SealedBox,它可以理解为只有通过密钥才能访问的数据容器,加密操作时把加密后的密文放在其中,解密操作时需要从中取出密文进行解密。

  • 加密
// 明文
let str = "Hello CryptoKit"
let data = str.data(using: .utf8)!

// 密钥,有3种长度的密钥
let key128 = SymmetricKey(size: .bits128)
let key192 = SymmetricKey(size: .bits192)
let key256 = SymmetricKey(size: .bits256)

// 加密
let encryptedContent = try? ChaChaPoly.seal(data, using: key256).combined复制代码
  • 解密
// 解密
if let encryptedContent = encryptedContent {
    if let sealedBox = try? ChaChaPoly.SealedBox(combined: encryptedContent) {
        if let decryptedContent = try? ChaChaPoly.open(sealedBox, using: key256) {
            print(String(data: decryptedContent, encoding: .utf8))
        }

        // SealedBox的3个属性
        let nonce = sealedBox.nonce
        let ciphertext = sealedBox.ciphertext
        let tag = sealedBox.tag

        print(sealedBox.combined == nonce + ciphertext + tag)
    }
}复制代码

数字签名

内置了 4 种不同的椭圆曲线类型用于创建和验证加密签名,分别是 Curve25519, P521, P384 和 P256,不同的类型有不同的安全性和速度,但通常选择 Curve25519。[563513413](https://jq.qq.com/?_wv=1027&k=lzJejkSl),不管你是大牛还是小白都欢迎入驻

  • 产生公/私钥
// 私钥
let privateKey = Curve25519.Signing.PrivateKey()
// 公钥
let publicKey = privateKey.publicKey
// 发布公钥
let publicKeyData = publicKey.rawRepresentation 复制代码
  • 私钥签名
let str = "Hello CryptoKit"
let data = str.data(using: .utf8)!

let signature = try? privateKey.signature(for: data)复制代码
  • 公钥验证
if let signature = signature {
    if publicKey.isValidSignature(NSData(data: signature) , for: data) {
        print("签名有效")
    }
}复制代码

密钥协商

密钥协商是一个过程,通过这个过程,通信双方可以安全地选择一个加密密钥,然后用它来进行加解密数据。

// 构造一个salt,生成密钥时需要使用
let salt = "YungFan".data(using: .utf8)!

// 用户A和用户B都会生成一对公钥和私钥
let privateKeyA = P521.KeyAgreement.PrivateKey()
let publicKeyA = privateKeyA.publicKey

let privateKeyB = P521.KeyAgreement.PrivateKey()
let publicKeyB = privateKeyB.publicKey

// 用户A用私钥和用户B的公钥产生一个共享的密钥
let sharedSecretA = try? privateKeyA.sharedSecretFromKeyAgreement(with: publicKeyB)
let symmetricKeyA = sharedSecretA?.hkdfDerivedSymmetricKey(using: SHA256.self, salt: salt, sharedInfo: Data(), outputByteCount: 32)

// 用户B用私钥和用户A的公钥产生一个共享的密钥
let sharedSecretB = try? privateKeyB.sharedSecretFromKeyAgreement(with: publicKeyA)
let symmetricKeyB = sharedSecretB?.hkdfDerivedSymmetricKey(using: SHA256.self, salt: salt, sharedInfo: Data(), outputByteCount: 32)

if symmetricKeyA == symmetricKeyB {
    print("A和B经过协商产生了共享密钥")
}

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关文章

  • iOS开发之CryptoKit

    Apple 在 WWDC2019 推出了一个基于 Swift 的密码框架 CryptoKit,它让生成哈希值、加/解密数据、数字签名和密钥协商变得更加容易。

    YungFan
  • iOS_版本低于iOS13 Crash:dyld: Library not loaded CryptoKit

    公司要了高通的Gaia库实现OTA,版本迭代他们用了CryptoKit,而我们的app还是支持iOS9的,所以得做一下兼容:

    mikimo
  • 这就是iPhone11?嗯…可能还会运行加密货币

    话说前段时间,有个叫@BenGeskin的谍照大人,曝光了一张iPhone 11 和 iPhone 11 Max 的渲染图,后置的三摄非常抢眼。

    区块链大本营
  • iOS 开发之Block

    iOS 开发之Block 一:什么是Block。Block的作用      UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法。     1.   ...

    Mr.RisingSun
  • iOS开发之DiffableDataSource

    在 iOS 13 中 Apple 为 UITableView 和 UICollectionView 引入了 DiffableDataSource,让开发者可以更...

    YungFan
  • iOS开发之UICollectionViewDataSourcePrefetching

    在iOS10中,苹果为UICollectionViewCell引入了Pre-Fetching预加载机制用于提升它的性能。主要引入了一个新的数据源协议UIColl...

    YungFan
  • iOS开发之UICollectionViewCompositionalLayout

    日常开发中最常用的控件莫过于 UITableView 和 UICollectionView,随着应用越来越复杂,以前的 UICollectionViewFlow...

    YungFan
  • iOS开发之UIMenu

    iOS 14 中引入UIDeferredMenuElement,允许异步地创建 UIMenu,也就是说可以动态在后台配置菜单的内容。

    YungFan
  • iOS开发之WidgetKit

    iOS 14 Apple 推出了 WidgetKit,Widget 就像一个迷你版的 App,可以快速访问它所提供的信息—比如天气、日历事件、笔记等。Widge...

    YungFan
  • iOS开发之WebView

      做iOS的应用也有一段时间了,在之前的demo中一直没有机会用到WebView,今天就查缺补漏一下,使用一下WebView。最早接触WebView是在And...

    lizelu
  • IOS开发之尺寸

      在移动端或者前端开发中,UI图通常是带标注的,指定某个控件的长宽等属性,一般UI给的是68px,72px这样的样式,但是我们在开发过程中通常又并不是完全按照...

    mukekeheart
  • iOS开发之定位

    在iOS开发中,定位是很多App都需要使用的功能。本文主要对iOS中的定位知识点进行介绍。本文代码环境为:Xcode 10.1 + Swift 4.2。

    YungFan
  • iOS开发之iOS10适配

    公司的项目,临上线之前做了一下iOS10的适配,发现一大堆的坑,瞬间觉得苹果不友好了。 一、证书问题 打开xcode8.0时编译运行时出现下面问题:

    s_在路上
  • iOS开发之性能优化

    性能问题的主要原因是什么,原因有相同的,也有不同的,但归根到底,不外乎内存使用、代码效率、合适的策略逻辑、代码质量、安装包体积这一类问题。

    胖虎_callmeV
  • iOS游戏开发之UIDynamic

    用户1941540
  • iOS开发之WidgetKit补充

    在 iOS 14 正式版发布之前我写了一篇博文《iOS开发之WidgetKit》,iOS 14 正式版发布以后,经测试,Apple 改变了 Widget 的 A...

    YungFan
  • IOS开发之新浪围脖

      IOS开发和Web开发一样,网络请求方式包括Get和Post方式。Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数...

    lizelu
  • iOS开发之蓝牙(一)

    在iOS开发中,我们最常用的蓝牙开发框架应该是Core Bluetooth,因为它可以与第三方蓝牙设备交互(必须要支持蓝牙4.0),蓝牙4.0以低功耗著称,所以...

    YungFan

扫码关注腾讯云开发者

领取腾讯云代金券