【问题标题】:Swift 3 export SecKey to StringSwift 3 将 SecKey 导出为字符串
【发布时间】:2017-09-25 22:11:57
【问题描述】:

我正在使用 swift 3 开发 iOS 应用。

我需要将SecKey(这是用户 RSA 公钥引用)导出到字符串(例如 base64),以便通过生成的 QRCode 共享它。

它还必须以其他方式工作,因为扫描QRCode 的其他用户将能够从从二维码中提取的字符串重建SecKey 引用。

我找到了一些教程,但我不明白我需要从 SecKey 参考中提取什么,我不知道如何将其转换为 String

【问题讨论】:

  • 你能得到Data的SecKey`吗?一旦你有了Data,就很容易得到一个base64字符串。
  • 你真的需要使用你那个棘手的SecKey类吗?在阅读this detailed question 之后,我认为这不是一个简单的技巧:-(
  • @PauloMattos 不幸的是,是的。我正在使用的加密库需要一个 SecKey 对象,因为我正在从应用程序生成这些密钥。

标签: ios swift swift3 public-key-encryption seckeyref


【解决方案1】:

导出密钥(仅限 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/5276890https://stackoverflow.com/a/27935528/5276890 了解可能支持 iOS

重新导入密钥

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 密钥而不是证书。网上很多代码示例都涉及如何使用 SecCertificateCreateWithData 从证书生成公钥

另外:512 位生成速度很快,但毫无价值。一旦您对结果感到满意,请选择一个更长且更安全的值。

在导入我生成和导出的密钥时,我得到了有效的结果,所以我认为它可以工作,但我没有尝试用它进行加密和解密。

【讨论】:

  • 我明天去试试。在重新导入时,cfdata 是 base64 字符串吗?
  • 哎呀。对不起。我很懒惰,没有费心从 String 生成 Data 和从 Data 生成 CFData。你能应付吗?否则我会在今天晚些时候尝试添加代码。
  • 没关系。我刚刚编辑了代码。该死的 cmets 5 分钟限制!
  • 谢谢,它可以用于导出公钥字符串,我也将它用于导出私钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多