【问题标题】:How do I encode an unmanaged<SecKey> to base64 to send to another server?如何将 unmanaged<SecKey> 编码为 base64 以发送到另一台服务器?
【发布时间】:2015-03-01 17:54:42
【问题描述】:

我正在尝试使用密钥对加密来验证我的应用程序和我的 PHP 服务器之间的身份。为此,我需要在我的应用中生成公钥后将其发送到服务器。

if let pubKey = NSData(base64EncodedData: publicKey, options: NSDataBase64DecodingOptions.allZeros)! {
    println(pubKey)
}

publicKey 的类型为 Unmanaged&lt;SecKey&gt;

我在上面的代码中遇到的错误是:Extra argument 'base64EncodedData' in call

我该怎么做?有没有更好的办法?

编辑:这是生成密钥对的方式:

var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>?
let parameters = [
    String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
    String(kSecAttrKeySizeInBits): 2048
]
let result = SecKeyGeneratePair(parameters, &publicKeyPtr, &privateKeyPtr)
let publicKey = publicKeyPtr!.takeRetainedValue()
let privateKey = privateKeyPtr!.takeRetainedValue()
let blockSize = SecKeyGetBlockSize(publicKey)

编辑 2: 所以问题是 SecKey 不是 NSData,所以我的问题应该是:如何将 publicKey:SecKey 转换为 NSData?

【问题讨论】:

  • publicKey 是如何定义的?它是 NSData 吗?
  • 谢谢!我已经编辑了我的问题以提供更多信息。
  • 我对此知之甚少,无法提供答案,但您可能会从这篇博文中学到一些东西:netsplit.com/…
  • 谢谢!我其实快到了。一旦我弄清楚拼图的最后一块,就会发布我的答案......(编辑)不,我没有。但我会尽快更新。
  • This 看起来像解决方案。但我仍然无法将其转换为 swift。

标签: swift base64 public-key-encryption


【解决方案1】:

Swift 4 方法从 SecKey, publicKey 中获取 base64 字符串 :)

guard let publicKeyData = SecKeyCopyExternalRepresentation(publicKey!, nil) else {
            NSLog("\tError obtaining export of public key.")
            return ""
        }
        let publicKeyNSData = NSData(data: publicKeyData as Data)
        let publicKeyBase64Str = publicKeyNSData.base64EncodedString()

【讨论】:

    【解决方案2】:

    虽然几乎没有记录这一事实,但您可以使用SecKeyCopyAttributesSecKey 中提取您需要的所有内容(即模数和指数)。

    详情请见here

    【讨论】:

      【解决方案3】:

      看来你可以暂时把钥匙存到钥匙串里,然后取回来转换成数据:

      func convertSecKeyToBase64(inputKey: SecKey) ->String? {
          // First Temp add to keychain
          let tempTag = "de.a-bundle-id.temp"
          let addParameters :[String:AnyObject] = [
              String(kSecClass): kSecClassKey,
              String(kSecAttrApplicationTag): tempTag,
              String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
              String(kSecValueRef): inputKey,
              String(kSecReturnData):kCFBooleanTrue
          ]
      
          var keyPtr: Unmanaged<AnyObject>?
          let result = SecItemAdd(addParameters, &keyPtr)
          switch result {
          case noErr:
              let data = keyPtr!.takeRetainedValue() as! NSData
      
              // Remove from Keychain again:
              SecItemDelete(addParameters)
              let encodingParameter = NSDataBase64EncodingOptions(rawValue: 0)
              return data.base64EncodedStringWithOptions(encodingParameter)
      
          case errSecDuplicateItem:
              println("Duplicate Item")
              SecItemDelete(addParameters)
              return nil
      
          case errSecItemNotFound:
              println("Not found!")
              return nil
      
          default:
              println("Error: \(result)")
              return nil
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        • 2016-01-30
        • 2012-03-10
        • 1970-01-01
        • 2015-06-25
        • 2013-12-03
        相关资源
        最近更新 更多