Swift 的 SecurityExtensions

Swift Version 5 CocoaPods Version Badge License Badge Supported Platforms Badge Percentage Documented Badge Swift Package Manager compatible

这个框架旨在使从 Swift 中使用一些 Apple 的 Security framework API 更加容易。我已经在 iOS 上测试过。它也可能在 OS X 上工作,但我没有深入研究。欢迎您创建 pull request :)

这个框架需要 Swift 版本 5。

概述

这个框架提供了以下基本功能。 有单元测试;请查看它们以获取示例。

SecCertificate 扩展

Create(derEncodedFile:)

通过从 DER 编码的文件加载内容来创建证书

SecCertificate.create(derEncodedFile file: String) -> SecCertificate?

data

获取 DER 格式的证书数据

let cert: SecCertificate = ...
let data: NSData = cert.data

publicKey

获取证书的公钥

let cert: SecCertificate = ...
let pubKey: SecKey? = cert.publickKey

SecIdentity 扩展

certificate

获取与身份关联的证书

let identity: SecIdentity =  ...
let cert: SecCertificate? = identity.certificate

privateKey

获取身份的私钥

let identity: SecIdentity =  ...
let privateKey: SecKey? = identity.privateKey

SecKey 扩展

请注意,加密仅在密钥是公钥时有效,而解密仅在密钥是私钥时有效。 这不由本框架验证,您的应用程序逻辑必须确保正确完成。

encrypt()

使用密钥加密数据或字符串。 请确保密钥是公钥,而不是私钥! 加密使用 PKCS1 填充。

let plainText = "This is some plain text."
let encrypted: [UInt8]? = publicKey.encrypt(plainText)

let plainBytes: [UInt8] = [1, 2, 3]
let encrypted: [UInt8]? = publicKey.encrypt(plainBytes)

decrypt()

使用密钥解密为数据或字符串。 请确保密钥是私钥,而不是公钥! 解密使用 PKCS1 填充。

let encryptedBytes: [UInt8] = ...
let plainText: String? = privateKey.decryptUtf8(encryptedBytes)

let encryptedBytes: [UInt8] = ...
let plainBytes: [UInt8]? = privateKey.decrypt(encryptedBytes)

keyData

如果可以从钥匙串中检索到密钥的数据,则返回密钥的数据。 换句话说:这仅在密钥存在于钥匙串中时才有效! 有关数据格式的详细信息,请参阅 API 文档。

let key: SecKey = ...
let keyData: [UInt8]? = key.keyData

create(withData:)

基于其原始数据(由 keyData 提供)创建 SecKey。 密钥也会导入到钥匙串中。 如果密钥已存在于钥匙串中,则只会返回该密钥。

let keyData: [UInt8] = ...
let key: SecKey? = SecKey.create(withData: keyData)

generateKeyPair()

生成一个私钥-公钥对。

let (privateKey, publicKey) = try SecKey.generateKeyPair(3072)

blockSize

返回密钥的块大小。

let key: SecKey = ...
let blockSize: Int = key.blockSize

sign()

使用当前密钥计算给定数据的数字签名。 这假定密钥是私钥。

let data: [UInt8] = [1, 2, 3]
let signature: [UInt8]? = privateKey.sign(data)

keychainTag

返回用于在钥匙串中存储密钥的标签。

let key: SecKey = ...
let tag: String = key.keychainTag

keychainTag(forKeyData:)

返回由给定数据表示的密钥的标签。 通常,您应该首选使用实例属性 keychainTag

let keyData: [UInt8] = ...
let tag: String = SecKey.keychainTag(forKeyData: keyData)

loadFromKeychain(tag:)

基于标签从钥匙串加载密钥。 标签是由 keychainTag 返回的字符串。

let tag: String = ...
let key: SecKey? = SecKey.loadFromKeychain(tag: tag)

SequenceType

这个框架还提供了 SequenceType 的扩展,允许创建字节数组的十六进制字符串表示形式。

hexString()

通过连接所有字节的十六进制表示形式来创建字节数组 (`[UInt8]`) 的字符串表示形式。 该字符串*不*包含通常用于指示十六进制表示形式的前缀 '0x'。 这是 `String.hexByteArray()` 的反函数。

let bytes: [UInt8] = [0, 1, 2, 255]
let hexString = bytes.hexString() // "0x000102ff"

String

`hexString` 的反函数在 `String` 的扩展中实现。

hexByteArray()

将包含字节的十六进制表示形式的字符串转换为字节数组。 该字符串不得包含任何其他内容。 它可以选择以 '0x' 前缀开头。 转换不区分大小写。 这是 `[UInt8].hexString()` 的反函数。

let hexString = "0xdeadbeef"
let bytes: [UInt8]? = hexString.hexByteArray() // [0xde, 0xad, 0xbe, 0xff]

用法

使用此库的最简单方法是使用 Swift Package Manager 或 CocoaPods。 对于 CocoaPods,请在您的 `Podfile` 中放入类似这样的内容

pod 'SecurityExtensions', '~> 4.0'

许可证

MIT 许可证 (MIT) 版权所有 (c) 2016 Stefan van den Oord

特此授予许可,免费向任何获得本软件和相关文档文件(“软件”)副本的人员授予许可,不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向其提供本软件的人员这样做,但须符合以下条件

上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,由软件或软件的使用或其他处理引起或与之相关的责任。