Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 公钥-私钥签名/编码_Ios_Swift_Jwt_Public Key Encryption_Private Key - Fatal编程技术网

Ios 公钥-私钥签名/编码

Ios 公钥-私钥签名/编码,ios,swift,jwt,public-key-encryption,private-key,Ios,Swift,Jwt,Public Key Encryption,Private Key,我一直在尝试对公钥和私钥进行base64编码。看起来我可以分别用密码对公钥和私钥进行编码 我的问题是,我无法按照应该的方式将它们组合在一起(在RS256中)。我已经阅读了大量的文档,但是我在尝试使用base64编码变量的最终任务时遇到了困难 我发现下面的代码很有用。基本上,我想做的是将公钥和私钥组合成一个令牌。这段代码是针对javascript的,但我似乎找不到类似于Swift的代码 // First, let's try to use the top-level one-off methods

我一直在尝试对公钥和私钥进行base64编码。看起来我可以分别用密码对公钥和私钥进行编码

我的问题是,我无法按照应该的方式将它们组合在一起(在RS256中)。我已经阅读了大量的文档,但是我在尝试使用base64编码变量的最终任务时遇到了困难

我发现下面的代码很有用。基本上,我想做的是将公钥和私钥组合成一个令牌。这段代码是针对javascript的,但我似乎找不到类似于Swift的代码

// First, let's try to use the top-level one-off methods.
jwt = new lib.JsonWebTokens();
 // Encode JWT token using 512-bit RSA signing algorithm.
token = jwt.encode( payload, "HS512", getPublicKey(), getPrivateKey() );
有人愿意看看这个,告诉我我错过了一两个步骤吗

其他详情: 这是针对Box api的

提前谢谢

---------------编辑-----------------------------------------------

我能够实现SwiftyRSA库。下面是示例代码。输出为我提供了一个JWT断言,该断言与JWT.io网站一起使用。但是…(请阅读下面的代码)

事实证明,我必须为每个字符使用base64url,这只是用其他字符替换一些字符的问题,等等。因此,一切看起来都很好,在jwt网站上仍然有效,但当我使用下面的代码发送它时,我收到以下错误消息:

{“error”:“invalid_grant”,“error_description”:“OpenSSL无法验证数据:错误:0906D06C:PEM例程:PEM_read_bio:无起始行”}

我已经完成了所有关于如何为Box API实现这一点的步骤,但它只是不起作用。我真的很想知道我做错了什么


提前谢谢

JWT.io列出了一些swift库,也许它们可以提供帮助。您实际上并没有对私钥进行编码;这需要保密。您使用私钥对令牌进行签名,这就是JavaScript库需要您提供私钥的原因。swiftyRSA既可以使用公钥进行加密,也可以使用私钥进行签名,但是为了构建有效的JWT,您需要执行单独的操作。谢谢您提供的清晰性,Paulw11!所以,我要做的是加密公钥,用私钥签名,然后用base64编码。至少,这是我从你的解释中得到的。我认为这实际上是可行的使用。
        do {
        // the keys
        let publicKey = try PublicKey(pemNamed: "public_key")
        let privateKey = try PrivateKey(pemNamed: "dec_private_key")

        // signing the base64url string
        let clear = try ClearMessage(string: encodedStuff, using: .utf8)
        let signature = try clear.signed(with: privateKey, digestType: .sha256)
        print(signature.data)

        // making the signature string base64url encoded
        let finalSig = signature.base64String.replacingOccurrences(of: "/", with: "_")
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "=", with: "")
        print("finalSig: ", finalSig)

        // encrypt the signature and make sure it's in base64url
        let dataToEncrypt = try ClearMessage(string: finalSig, using: .utf8)
        let encryptedData = try dataToEncrypt.encrypted(with: publicKey, padding: .PKCS1)
        let finalEncryptedData = encryptedData.base64String.replacingOccurrences(of: "/", with: "_")
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "=", with: "")
        print(finalEncryptedData)

        // concatenate assertion
        jwtAssertion = encodedStuff + "." + finalEncryptedData
        print("JWT Assertion: \(jwtAssertion)")

        // decrypt to see if it works
        let recodedBase64 = base64urlToBase64(base64url: finalEncryptedData)
        let theEncrypted = try EncryptedMessage(base64Encoded: recodedBase64)
        let clearMessage = try theEncrypted.decrypted(with: privateKey, padding: .PKCS1)
        // decode decrypted message
        let finalDecrypted1 = clearMessage.base64String
        let finalDecrypted2 = Data(base64Encoded: finalDecrypted1)
        let finalDecrypted3 = String(data: finalDecrypted2!, encoding: .utf8)
        print("finalDecrypted3: ", finalDecrypted3 ?? "no go!") //this gives you the finalSig (which is decrypted)



    } catch let thisError {
        print("An error has occurred!",thisError)
    }