【问题标题】:Exporting SecKey from iOS to watchOS将 SecKey 从 iOS 导出到 watchOS
【发布时间】:2017-04-26 22:58:50
【问题描述】:

我正在尝试在我的 iOS 应用程序与其对应的 watchOS 应用程序之间同步私有非对称密钥。我尝试使用SecKeyCopyExternalRepresentation 将其导出为CFData,然后使用WatchConnectivity 将其发送到手表。但是,当它到达手表时,我无法将数据转换回SecKey。我尝试使用SecKeyCreateWithData 来尝试重新创建它,但它似乎只适用于对称密钥,因为当我尝试它时它会使手表应用程序崩溃。有什么想法吗?

iOS 代码:

func sendSharedKeyPair(keyPair: (publicKey: SecKey, privateKey: SecKey)) {
    var error: Unmanaged<CFError>?

    let publicKeyData = SecKeyCopyExternalRepresentation(keyPair.publicKey, &error)
    if let error = error {
        return print("Error sending shared key: \(error)")
    }
    let privateKeyData = SecKeyCopyExternalRepresentation(keyPair.privateKey, &error)
    if let error = error {
        return print("Error sending shared key: \(error)")
    }

    if let publicKeyData = publicKeyData, let privateKeyData = privateKeyData {
        session.sendMessage(["requestedCommand": WatchControllerCommands.sendSharedKeyPair.rawValue, "keyPair": ["publicKey": publicKeyData, "privateKey": privateKeyData]], replyHandler: nil, errorHandler: { error in
            print(error)
        })
    }


}

watchOS 代码:

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
    guard let requestedCommand = (message["requestedCommand"] as? String).flatMap({ WatchControllerCommands(rawValue: $0) }), requestedCommand == .sendSharedKeyPair else { return }

    guard let publicKeyData = (message["keyPair"] as? [String: Any])?["publicKey"].flatMap({ $0 as? Data }), let privateKeyData = (message["keyPair"] as? [String: Any])?["privateKey"].flatMap({ $0 as? Data }) else { return print("Couldn't parse keys") }

    let publicTag = "myAppTag"
    let privateTag = publicTag + ".private"

    let privateAttributes = [String(kSecAttrIsPermanent): true,
                             String(kSecAttrApplicationTag): privateTag] as [String : Any]
    let publicAttributes = [String(kSecAttrIsPermanent): true,
                            String(kSecAttrApplicationTag): publicTag] as [String : Any]

    var error: Unmanaged<CFError>?
    let publicCFData = publicKeyData as CFData
    let privateCFData = privateKeyData as CFData
    let publicCFDict = publicAttributes as CFDictionary
    let privateCFDict = privateAttributes as CFDictionary
    SecKeyCreateWithData(publicCFData, publicCFDict, &error)
    if let error = error {
        print(error)
    }
    SecKeyCreateWithData(privateCFData, privateCFDict, &error)
    if let error = error {
        print(error)
    }
}

【问题讨论】:

    标签: ios security watchos


    【解决方案1】:

    来自SecKeyCreateWithData附近的headerdocs:

    @param attributes 包含描述键的属性的字典 被导入。这个字典中的键是 kSecAttr* 常量 来自 SecItem.h。强制属性是:* kSecAttrKeyType * kSecAttrKeyClass * kSecAttrKeySizeInBits

    您的代码只定义了kSecAttrIsPermanentkSecAttrApplicationTag 属性。

    【讨论】:

    • @SerenadeX,很高兴为您提供帮助
    猜你喜欢
    • 1970-01-01
    • 2017-09-25
    • 2019-11-11
    • 2017-11-24
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2015-01-04
    • 2020-07-07
    相关资源
    最近更新 更多