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

Jose-JWT中的公钥加密

屠晟睿
2023-03-14

我想这个问题不是上当,所以我会试着解释一下我的情况。

我正在测试JWT,更具体地说是来自Github的JOSE-JWT lib,但是我遇到了一些麻烦。

我使用PHP和PHPSeclib生成一个私钥-公钥对,并将公钥发送给客户机。一切都是正确的,正如你在那里看到的。我的客户机接收JSON并将其转换为对象,然后使用JSON.NET将其提取为字符串。

        public static RSACryptoServiceProvider GetRSAProviderFromPemFile(string pemfile)
        {
            return GetRSAProviderFromPemString(File.ReadAllText(pemfile).Trim());
        }

        public static RSACryptoServiceProvider GetRSAProviderFromPemString(string pemstr)
        {
            bool isPrivateKeyFile = true;

            if (pemstr.StartsWith(pempubheader) && pemstr.EndsWith(pempubfooter))
                isPrivateKeyFile = false;

            byte[] pemkey;
            if (isPrivateKeyFile)
                pemkey = DecodeOpenSSLPrivateKey(pemstr);
            else
                pemkey = DecodeOpenSSLPublicKey(pemstr);

            if (pemkey == null)
                return null;

            if (isPrivateKeyFile)
                return DecodeRSAPrivateKey(pemkey);
            else
                return DecodeX509PublicKey(pemkey);
        }
            var payload1 = new Dictionary<string, object>()
            {
                { "sub", "mr.x@contoso.com" },
                { "exp", 1300819380 }
            };

            Console.WriteLine("Jose says: {0}", JWT.Encode(payload1, pubkey, JwsAlgorithm.RS256));

还有弹力城堡:

            var claims = new List<Claim>();
            claims.Add(new Claim("claim1", "value1"));
            claims.Add(new Claim("claim2", "value2"));
            claims.Add(new Claim("claim3", "value3"));

            Console.WriteLine("Bouncy Castle says: {0}", Helpers.CreateToken(claims, pubkeyStr));

例外情况:

CreateToken方法摘自此处:https://stackoverflow.com/a/44857593/3286975

    public static string CreateToken(List<Claim> claims, string privateRsaKey)
    {
        RSAParameters rsaParams;
        using (var tr = new StringReader(privateRsaKey))
        {
            var pemReader = new PemReader(tr);
            var keyPair = pemReader.ReadObject() as AsymmetricCipherKeyPair;
            if (keyPair == null)
            {
                throw new Exception("Could not read RSA private key");
            }
            //var privateRsaParams = keyPair.Private as RsaPrivateCrtKeyParameters;
            rsaParams = DotNetUtilities.ToRSAParameters(keyPair.Public as RsaKeyParameters); //DotNetUtilities.ToRSAParameters(privateRsaParams);
        }
        using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
        {
            rsa.ImportParameters(rsaParams);
            Dictionary<string, object> payload = claims.ToDictionary(k => k.Type, v => (object)v.Value);
            return Jose.JWT.Encode(payload, rsa, Jose.JwsAlgorithm.RS256);
        }
    }

在这个Java示例中,它使用公钥加密数据,而不是私有密钥。

我不知道为什么C#示例在客户端使用私钥,这是错误的,有人能解释一下为什么吗?我如何解决这个问题?

共有1个答案

鲁明知
2023-03-14

我已经找到了我所面临的两个问题之一的答案,那就是我还没有完全阅读何塞-智威汤逊回购协议,它说:

var payload = new Dictionary<string, object>()
{
    { "sub", "mr.x@contoso.com" },
    { "exp", 1300819380 }
};

var publicKey=... //Load it from there you need

string token = Jose.JWT.Encode(payload, publicKey, JweAlgorithm.RSA_OAEP, JweEncryption.A256GCM);

我已经意识到Bouncy Castle只是一个操纵公钥-私钥的API,加密-解密工作是由Jose-JWT完成的。所以,我的问题解决了。

 类似资料:
  • 对示例代码中应用的概念“带RSA加密的JSON Web令牌(JWT)”有疑问 参见:http://connect2id.com/products/nimbus-jose-jwt/examples/jwt-with-rsa-encryption 我的问题:为什么客户端使用私钥?为什么不在加密器上使用私钥,在解密器类上使用公钥呢? 欢迎对此RSA示例代码的概念方面进行澄清。

  • 我明白JWT规范没有涵盖这一点:但我很想知道在实际的JWT使用中有哪些常见的做法。 当然,这个问题与HTTPS中涉及的证书无关:我只是在讨论JWT签名和加密中使用的密钥。

  • 我试图理解使用带有私钥/公钥(RS512)的JSON Web令牌的逻辑,当将从客户端(在本例中是React Native App)发送到服务器的数据有效载荷签名时。 我认为私钥/公钥的全部意义在于将私钥保持为私钥(在我的服务器上),并将公钥交给成功登录应用程序的人。 我认为,对于我的服务器的每个API请求,经过身份验证的应用程序用户将使用公钥创建JWT(在客户端),服务器将使用私钥验证来自API请

  • Auth0提供了两个JWT库,一个用于Node:Node jsonwebtoken,另一个用于Java:Java JWT。 我创建了私有/公钥对,并在Node中成功地使用了node-jsonwebToken: 但是我发现没有办法在java-jwtJava做同样的事情。 有人有一个如何在Java中为JWT使用私钥/公钥的工作示例吗?

  • 鉴于: 由RSACryptoServiceProvider生成的签名密钥。 创建带有孩子的签名jwt的需求。 如果签名密钥来自x509证书,那么我会将kid设置为x5t。在这种情况下,情况并非如此。我可以为孩子编造一些武断的东西,但是如果碰撞不太可能发生,并且孩子和证书之间存在有意义的联系,那就最好了。 我的意图是:- 创建一个字节数组,通过将模字节附加到指数字节来创建。 SHA256编码数组。

  • 我正在实施类似于:https://login.microsoftonline.com/common/discovery/v2.0/keys Spring boot JWT应用程序,用于生成和验证JWT令牌。我将生成许多公钥/私钥(我不想用一个密钥生成所有令牌。一个密钥对将生成生命周期较短的令牌,第二个密钥对将生成更长的令牌…)我将使用公钥创建endpoint/密钥。问题是:如何在我的应用程序中连接