Ios 公钥-私钥签名/编码
我一直在尝试对公钥和私钥进行base64编码。看起来我可以分别用密码对公钥和私钥进行编码 我的问题是,我无法按照应该的方式将它们组合在一起(在RS256中)。我已经阅读了大量的文档,但是我在尝试使用base64编码变量的最终任务时遇到了困难 我发现下面的代码很有用。基本上,我想做的是将公钥和私钥组合成一个令牌。这段代码是针对javascript的,但我似乎找不到类似于Swift的代码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
// 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)
}