【问题标题】:Validate JWT token with RS256 or RS512 with Swift iOS使用 Swift iOS 使用 RS256 或 RS512 验证 JWT 令牌
【发布时间】:2017-09-23 13:44:21
【问题描述】:

我正在使用 Swift 构建一个 iOS 应用程序,该应用程序需要能够使用 RS256 或 RS512 使用公钥证书验证 JWT 令牌签名。

我一直在努力寻找支持此类功能的库,但在实现我找到的功能时遇到了问题。

因此,我的问题是,为 Swift iOS 应用程序实现此类功能的推荐方法是什么?

理想的场景是能够使用 JWT.io 上公认的框架之一。 JWT.io 上唯一支持 RS256 或 RS512 的 Swift 库是以下库: https://github.com/vapor/jwt

这个库支持的功能是理想的,但是它需要通过 Swift 包管理器实现,并且是使用 Vapor 构建的。 iOS 目前不支持 Swift 包管理器,但我读到有一些变通方法可以让 swift 包管理器与 iOS 应用程序一起使用。如果库可以在 iOS 应用程序上运行,这些是愿意采取的解决方法。但是,由于该库是为 Vapor 构建的,我的问题是是否有可能让该库在我正在构建的 iOS 应用程序上运行?

如果无法使用此库,是否有其他库推荐使用?如果不是,那么推荐的方法来实现这个请求的功能是什么?是否有推荐的可以在应用程序上运行的 Objective-C 库?

提前致谢!

编辑: 通过验证,我的意思是我想验证令牌中的签名是否正确,这意味着 JWT 令牌已使用服务器上与应用程序上的公钥证书对应的私钥进行签名。不仅仅是解码 Base64Check 负载。

编辑 2: 我想要实现的是支持非对称密钥的功能,这意味着密钥必须不同时存储在服务器和客户端应用程序上。我试图实现该应用程序仅包含非机密信息,因此是一个公钥证书。

【问题讨论】:

标签: ios objective-c swift jwt vapor


【解决方案1】:

不确定您是否仍然坚持这一点,但我的情况完全相同,花了一段时间才弄清楚。我最终使用了JWT pod,并被this 文章推向了正确的方向。我会总结一下我的发现。

由于 Apple 放弃了 OpenSSL 以支持他们自己的安全库,因此输入必须是包含公钥的自签名证书。使用 OpenSSL 使用您的私钥作为输入执行以下操作:

openssl req -key private_key.pem -new -x509 -days 3650 -out selfsigned_cert.pem

然后将PEM格式转换为DER,基本就是去掉b64装甲:

openssl x509 -outform der -in selfsigned_cert.pem -out selfsigned_cert.der

将 .der 文件添加到 Xcode 项目中的Supporting Files,然后从磁盘读取证书数据并对其进行 base64 编码:

NSURL *fileURL = [NSURL fileURLWithPath:[bundle pathForResource: @"selfsigned_cert" ofType:@"der"]];
NSData *certificateData = [NSData dataWithContentsOfURL:fileURL];
// Probably want to do a nil-check on certificateData here
NSString *certificateStr = [JWTBase64Coder base64UrlEncodedStringWithData:certificateData];

然后将其插入 JWT 解码器:

JWTBuilder *decodeBuilder = [JWTBuilder decodeMessage:token] // your JWT
  .secret(certificateStr)
  .algorithmName(algorithmName); // From your token or a predefined string
NSDictionary *payload = decodeBuilder.decode;

您可以通过检查构建器中的错误来检查解码/验证是否成功:

if(decodeBuilder.jwtError != nil) { /* do stuff */ }

编辑:作为旁注。转换为 DER 然后 b64 编码它可能看起来是多余的,它基本上只是从 PEM 格式中删除了锚线。我在磁盘上有一个 .der 文件的原因是,如果需要,我们可以直接将其与安全库一起使用。

【讨论】:

  • 这个答案很有帮助,应该被接受。
  • 这让我更接近于归档我的目标,即在 iOS (swift) 上验证使用私有 RS256 签名的 JWT。但答案似乎已经过时,JWT pod 更新了几次。谁能提供一个关于如何做到这一点的快速示例?我们还需要自签名证书还是公钥就足够了?
  • @iCediCe 在这个答案的链接库中的一个问题中有一些讨论,但据我所知,到目前为止没有人这样做。我自己正在寻找一个 Swift 解决方案..
  • 谢谢,但在我的情况下,当 SecCertificateCreateWithData(certificateData) 变为 nil 时它会崩溃
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 2017-02-17
  • 2017-06-20
  • 2020-12-27
  • 2021-05-10
  • 2018-12-31
  • 2016-12-13
  • 2018-11-01
相关资源
最近更新 更多