首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jose-JWT中的公钥加密

Jose-JWT中的公钥加密
EN

Stack Overflow用户
提问于 2018-05-07 15:47:40
回答 1查看 3.5K关注 0票数 0

我认为这个问题不是骗人的,所以我会尽量解释我的情况。

我正在测试JWT,更确切地说是来自Github的JOSE-JWT lib,而且我遇到了麻烦。

我正在生成一个私钥对,并使用PHP和phpseclib向客户端发送公钥。一切都是正确的,因为您可以看到那里。我的客户端正在接收JSON,并将其转换为对象,并使用JSON.NET将其提取为字符串。

我使用BouncyCastle和一个堆栈溢出的回答进行一些修改,可以直接从字符串读取,而不是从文件中读取。

代码语言:javascript
复制
        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);
        }

他们两人都给了我问题,答案和使用的文档来自何塞回购:

代码语言:javascript
复制
            var payload1 = new Dictionary<string, object>()
            {
                { "sub", "mr.x@contoso.com" },
                { "exp", 1300819380 }
            };

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

异常:

英语同等学历:Keyset-does-not-exist.html

有了弹跳城堡:

代码语言:javascript
复制
            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

我对这个方法做了一些修改:

代码语言:javascript
复制
    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);
        }
    }

在这两种情况下,加密方法都是在寻找私钥(在客户端?).所以,我的问题是为什么这个例子在客户端使用私钥,如果维基百科这样说:

资料来源: 密码学

在一些情况下,我发现了我认为是正确的:

https://connect2id.com/products/nimbus-jose-jwt/examples/jwt-with-rsa-encryption

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-10 00:14:23

我已经找到了两个问题之一的答案,而且我还没有完全阅读JOSE回购,它说:

代码语言:javascript
复制
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城堡只是一个用来操纵公共私钥的API,加密解密工作是由JOSE-JWT完成的。所以我的问题解决了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50218007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档