当前位置: 首页 > 知识库问答 >
问题:

如何在C中使用RSA公钥验证JWT签名

夏兴生
2023-03-14

我想知道是否有一个示例C代码或库可以使用RSA公钥验证我的JWT令牌签名。我找不到任何涉及C的示例

openssl for C没有任何与RSA相关的示例。

谢谢

共有1个答案

那弘
2023-03-14

使用jwt-cpp库非常简单,下面是验证使用RS256密钥签名的令牌的示例代码:

#include <iostream>
#include <jwt-cpp/jwt.h>

int main() {
    const std::string token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEzMzciLCJ1c2VybmFtZSI6ImJpem9uZSIsImlhdCI6MTU5NDIwOTYwMCwicm9sZSI6InVzZXIifQ.YLOVSKef-paSnnM8P2JLaU2FiS8TbhYqjewLmgRJfCj1Q6rVehAHQ-lABnKoRjlEmHZX-rufHEocDxGUYiGMjMexUQ3zt-WqZITvozJ4pkvbV-mJ1nKj64NmqaR9ZkBWtmF-PHJX50eYjgo9rzLKbVOKYOUa5rDkJPHP3U0aaBXFP39zsGdOTuELv436WXypIZBeRq2yA_mDH13TvzegWCK5sjD4Gh177bCq57tBYjhGIQrDypVe4cWBPlvwFlmG8tdpWGu0uFp0GcbTAfLUlbTSuGROj88BY0XeUs0iqmGlEICES3uqNx7vEmdT5k_AmL436SLedE0VHcyxve5ypQ";

    try
    {
        // Parse token
        const auto decoded = jwt::decode(token);

        // Validate token
        const auto verifier = jwt::verify()
            .allow_algorithm(jwt::algorithm::rs256{ R"(-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnzyis1ZjfNB0bBgKFMSv
vkTtwlvBsaJq7S5wA+kzeVOVpVWwkWdVha4s38XM/pa/yr47av7+z3VTmvDRyAHc
aT92whREFpLv9cj5lTeJSibyr/Mrm/YtjCZVWgaOYIhwrXwKLqPr/11inWsAkfIy
tvHWTxZYEcXLgAXFuUuaS3uF9gEiNQwzGTU1v0FqkqTBr4B8nW3HCN47XUu0t8Y0
e+lf4s4OxQawWD79J9/5d3Ry0vbV3Am1FtGJiJvOwRsIfVChDpYStTcHTCMqtvWb
V6L11BWkpzGXSW4Hv43qa+GSYOD2QU68Mb59oSk2OB+BtOLpJofmbGEGgvmwyCI9
MwIDAQAB
-----END PUBLIC KEY-----)" });
            // Don't forget to add validation an issuer of token ("iss" claim in the payload)
            // .with_issuer("issuer");

        verifier.verify(decoded);

        // Print claims from payload
        for (auto& e : decoded.get_payload_claims())
            std::cout << e.first << " = " << e.second << std::endl;
    }
    catch (const std::system_error& e) {
        std::cout << "Verification error: " << e.what() << std::endl;
    }
    catch (...)
    {
        std::cout << "Unknown verification error" << std::endl;
    }
}

您可以使用公钥或证书进行验证,只需以PEM格式传递即可:

-----BEGIN PUBLIC KEY-----
[key]
-----END PUBLIC KEY-----

-----BEGIN CERTIFICATE-----
[certificate]
-----END CERTIFICATE-----
 类似资料:
  • 在PHP中,我试图使用AWS的RSA公钥(我在https://cognito-identity.amazonaws.com/.well-known/jwks_uri). 密钥以适当的页眉/页脚开始,然后开始RSA公钥等等。我查看了一些PHP库,如Emarref\Jwt\Jwt\code>,但是我发现了错误:。这一切归结为基本的php函数:。 我已经研究了php。net/manual进行openss

  • 我想验证一些来自Microsoft的JWT的签名。我正在使用Spring-Boot、JJWT库和以下endpoint:https://login.microsoftonline.com/common/discovery/v2.0/keys endpoint返回JSON公钥数组。下面是数组中的一个示例。

  • 验证应用程序: 据我所知.pfx文件包含公钥和私钥信息,因此我不应该让任何人都可以使用它。据我所知,验证步骤只需要公钥。我如何使用rsa.verifydata或其他函数来验证签名而不暴露我的pfx文件?

  • 我的理解是公钥加密,私钥解密...有谁能帮我弄明白吗?

  • 问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载

  • 我想知道在spring boot security中使用公钥和私钥创建和验证JWT签名的过程。 我试图使用HMAC算法验证JWT令牌。我正在用硬编码的秘密“秘密”构建JWT。 解析代码的步骤如下 我想使用公钥和私钥,而不是使用签名密钥作为“秘密”