我正在使用 swift 3 开发一个 iOS 应用。
我需要将 SecKey
(这是用户 RSA 公钥引用)导出到字符串(例如 base64),以便通过生成的 QRCode 共享它。
它也必须以其他方式工作,因为扫描 QRCode
的其他用户将能够从从 QRCode 中提取的字符串重建 SecKey
引用。
我找到了一些教程,但我不明白我需要从 SecKey
引用中提取什么,我也不知道如何将它转换为 String
.
最佳答案
导出 key (仅限 iOS 10)
var error:Unmanaged<CFError>?
if let cfdata = SecKeyCopyExternalRepresentation(publicKey!, &error) {
let data:Data = cfdata as Data
let b64Key = data.base64EncodedString()
}
参见 https://stackoverflow.com/a/30662270/5276890和 https://stackoverflow.com/a/27935528/5276890可能支持 iOS < 10 的更长的方式。
重新导入 key
guard let data2 = Data.init(base64Encoded: b64Key) else {
return
}
let keyDict:[NSObject:NSObject] = [
kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecAttrKeyClass: kSecAttrKeyClassPublic,
kSecAttrKeySizeInBits: NSNumber(value: 512),
kSecReturnPersistentRef: true as NSObject
]
guard let publicKey = SecKeyCreateWithData(data2 as CFData, keyDict as CFDictionary, nil) else {
return
}
注意:这会生成 base64 key 而不是证书。网上有很多代码示例处理如何使用 SecCertificateCreateWithData 从证书生成公钥
此外:512 位生成速度很快但毫无值(value)。对结果满意后,选择更长且安全的值。
导入我生成和导出的 key 时,我得到了有效结果,所以我认为它有效,但我没有尝试用它加密和解密。
关于ios - Swift 3 将 SecKey 导出到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43669237/