加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 如何编码非托管到base64以发送到另一台服务器?

发布时间:2020-12-14 05:33:03 所属栏目:百科 来源:网络整理
导读:我正在尝试使用密钥对加密来验证我的应用程序和我的 PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器. if let pubKey = NSData(base64EncodedData: publicKey,options: NSDataBase64DecodingOptions.allZeros)! { println(pub
我正在尝试使用密钥对加密来验证我的应用程序和我的 PHP服务器之间的身份.为此,我需要在我的应用程序中生成公钥后将公钥发送到服务器.
if let pubKey = NSData(base64EncodedData: publicKey,options: NSDataBase64DecodingOptions.allZeros)! {
    println(pubKey)
}

publicKey的类型为Unmanaged< SecKey>.

我在上面的代码中得到的错误是:调用中的额外参数’base64EncodedData’

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

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

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?

您似乎可以将密钥临时存储到钥匙串,然后将其恢复并将其转换为数据:
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
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读