Swift版本SecurityExtensions
此框架旨在使从Swift中更方便地使用一些Apple安全框架API。我在iOS上进行了测试。它可能也适用于OS X,未深入研究。欢迎您创建拉取请求:
此框架需要Swift版本3。
概览
此框架提供以下原语。有单元测试;您可以查看它们作为示例。
SecCertificate扩展
创建(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
此框架还提供一个扩展,允许创建字节数组的十六进制字符串表示。
hexString()
通过连接所有字节的十六进制表示来创建字节数组的字符串表示([UInt8]
)。该字符串不包括通常用于指示十六进制表示的前缀 '0x'。这是 String.hexByteArray()
的相反函数。
let bytes: [UInt8] = [0, 1, 2, 255]
let hexString = bytes.hexString() // "0x000102ff"
字符串
hexString
的反函数实现在String
的扩展中。
hexByteArray()
将包含字节的十六进制表示的字符串转换为字节数组。字符串不能包含其他任何内容。它可以可选地以前缀'0x'开始。转换不区分大小写。这是[UInt8].hexString()
的反函数。
let hexString = "0xdeadbeef"
let bytes: [UInt8]? = hexString.hexByteArray() // [0xde, 0xad, 0xbe, 0xff]
用法
使用此库的最简单方法是使用CocoaPods。只需在你的Podfile
中添加如下内容
pod 'SecurityExtensions', '~> 1.0'
许可
MIT许可(MIT)版权(c)2016 Stefan van den Oord
特此授予任何人获得此软件及其相关文档文件(“软件”)副本的权利,免费许可使用该软件,不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并准许获得该软件的人实施上述行为,前提如下
上述版权声明和本许可声明应包含在软件的所有副本或主要部分的副本中。
软件按“原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、适用于特定目的和不侵犯知识产权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论源于合同、侵权或其他法律行为,或与其有关、源于使用或与其他方式处理软件而引起的。