这个框架旨在使从 Swift 中使用一些 Apple 的 Security framework API 更加容易。我已经在 iOS 上测试过。它也可能在 OS X 上工作,但我没有深入研究。欢迎您创建 pull request :)
这个框架需要 Swift 版本 5。
这个框架提供了以下基本功能。 有单元测试;请查看它们以获取示例。
通过从 DER 编码的文件加载内容来创建证书
SecCertificate.create(derEncodedFile file: String) -> SecCertificate?
获取 DER 格式的证书数据
let cert: SecCertificate = ...
let data: NSData = cert.data
获取证书的公钥
let cert: SecCertificate = ...
let pubKey: SecKey? = cert.publickKey
获取与身份关联的证书
let identity: SecIdentity = ...
let cert: SecCertificate? = identity.certificate
获取身份的私钥
let identity: SecIdentity = ...
let privateKey: SecKey? = identity.privateKey
请注意,加密仅在密钥是公钥时有效,而解密仅在密钥是私钥时有效。 这不由本框架验证,您的应用程序逻辑必须确保正确完成。
使用密钥加密数据或字符串。 请确保密钥是公钥,而不是私钥! 加密使用 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)
使用密钥解密为数据或字符串。 请确保密钥是私钥,而不是公钥! 解密使用 PKCS1 填充。
let encryptedBytes: [UInt8] = ...
let plainText: String? = privateKey.decryptUtf8(encryptedBytes)
或
let encryptedBytes: [UInt8] = ...
let plainBytes: [UInt8]? = privateKey.decrypt(encryptedBytes)
如果可以从钥匙串中检索到密钥的数据,则返回密钥的数据。 换句话说:这仅在密钥存在于钥匙串中时才有效! 有关数据格式的详细信息,请参阅 API 文档。
let key: SecKey = ...
let keyData: [UInt8]? = key.keyData
基于其原始数据(由 keyData
提供)创建 SecKey。 密钥也会导入到钥匙串中。 如果密钥已存在于钥匙串中,则只会返回该密钥。
let keyData: [UInt8] = ...
let key: SecKey? = SecKey.create(withData: keyData)
生成一个私钥-公钥对。
let (privateKey, publicKey) = try SecKey.generateKeyPair(3072)
返回密钥的块大小。
let key: SecKey = ...
let blockSize: Int = key.blockSize
使用当前密钥计算给定数据的数字签名。 这假定密钥是私钥。
let data: [UInt8] = [1, 2, 3]
let signature: [UInt8]? = privateKey.sign(data)
返回用于在钥匙串中存储密钥的标签。
let key: SecKey = ...
let tag: String = key.keychainTag
返回由给定数据表示的密钥的标签。 通常,您应该首选使用实例属性 keychainTag
。
let keyData: [UInt8] = ...
let tag: String = SecKey.keychainTag(forKeyData: keyData)
基于标签从钥匙串加载密钥。 标签是由 keychainTag
返回的字符串。
let tag: String = ...
let key: SecKey? = SecKey.loadFromKeychain(tag: tag)
这个框架还提供了 SequenceType 的扩展,允许创建字节数组的十六进制字符串表示形式。
通过连接所有字节的十六进制表示形式来创建字节数组 (`[UInt8]`) 的字符串表示形式。 该字符串*不*包含通常用于指示十六进制表示形式的前缀 '0x'。 这是 `String.hexByteArray()` 的反函数。
let bytes: [UInt8] = [0, 1, 2, 255]
let hexString = bytes.hexString() // "0x000102ff"
`hexString` 的反函数在 `String` 的扩展中实现。
将包含字节的十六进制表示形式的字符串转换为字节数组。 该字符串不得包含任何其他内容。 它可以选择以 '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
特此授予许可,免费向任何获得本软件和相关文档文件(“软件”)副本的人员授予许可,不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向其提供本软件的人员这样做,但须符合以下条件
上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。
本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,由软件或软件的使用或其他处理引起或与之相关的责任。