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

URL编码后,数字1随机附加到我的JWT秘密的末尾

宰修能
2023-03-14

我到处寻找解决我问题的办法,但似乎找不到。

我有一个类,它利用方法创建JSON Web令牌。我创建的web令牌需要符合以下条件(请注意,我的机密最右侧没有数字1):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBrZXkiOiIxMjMtNDU2LTc4OS0wIiwicmVzb3VyY2UiOiJnZXRfZ2VvY29kZSJ9.xGLb92d6yVLqLf5TnrahMCxm-OGTHmXiXLvnRUqLWYM

我生成的令牌与上面的令牌匹配,除了数字1随机附加在我的令牌的最右端:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBrZXkiOiIxMjMtNDU2LTc4OS0wIiwicmVzb3VyY2UiOiJnZXRfZ2VvY29kZSJ9.xGLb92d6yVLqLf5TnrahMCxm-OGTHmXiXLvnRUqLWYM1

如您所见,这是JWT中包含秘密的部分。让我演示如何生成和加密令牌,以便您可以帮助诊断问题。我将向您展示整个类,然后引导您完成方法。

以下是整个课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Security.Cryptography;

namespace Project.JWT
{
    public class Token
    {

        public string CreateToken(string resource, string appkey, string secret, string algorithm)
        {
            if (algorithm != "HS256")
                return "Algorithm not supported";

            JwtPayload payload = new JwtPayload
            {
                appkey = appkey,
                resource = resource
            };

            return EncodeToken(payload, secret);

        }

        public static string EncodeToken(JwtPayload jwtPayload, string secret)
        {
            const string algorithm = "HS256";

            var header = new Header
            {
                typ = "JWT",
                alg = algorithm
            };

            var jwt = Base64Encode(JsonConvert.SerializeObject(header)) + "." + Base64Encode(JsonConvert.SerializeObject(jwtPayload));

            jwt += "." + Sign(jwt, secret);

            return jwt;
        }


        public static string Base64Encode(dynamic obj)
        {
            Type strType = obj.GetType();

            var base64EncodedValue = Convert.ToBase64String(strType.Name.ToLower() == "string" ? Encoding.UTF8.GetBytes(obj) : obj);
            return base64EncodedValue;
        }


        private static string Sign(string str, string key)
        {


            byte[] signature;

            using (var crypto = new HMACSHA256(Encoding.UTF8.GetBytes(key)))
            {
                signature = crypto.ComputeHash(Encoding.UTF8.GetBytes(str));
            }

            return System.Web.HttpServerUtility.UrlTokenEncode(signature);

        }

    }


    public class Header
    {
        public string alg { get; set; }
        public string typ { get; set; }
    }

    public class JwtPayload
    {
        public string appkey { get; set; }
        public string resource { get; set; }
    }


}

首先,向CreateToken方法传递凭据以创建负载。然后调用EncodeToken方法,该方法将有效负载和机密作为参数。请记住,我的秘密是一个硬编码字符串,它在应用程序的整个生命周期中都不会改变;所以我知道这不是随机生成数字1。

第39行,标头和有效负载被转换为一个base 64字符串,并由一个点连接在一起,该点完美地生成了我的令牌的前两部分:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHBrZXkiOiIxMjMtNDU2LTc4OS0wIiwicmVzb3VyY2UiOiJnZXRfZ2VvY29kZSJ9

然后,我在第41行调用Sign方法,该方法使用SHA256算法请求对我的令牌进行签名。

Sign方法接受组合的标头和有效负载作为str,然后将秘密作为密钥传递。

在第62行,我开始使用我的自定义密钥创建签名,它是“测试秘密”。

然后我在第67行对签名进行URL编码,就在返回之前。当我返回它时,第41行将令牌的三个部分组合在一起,从而给我留下了一个完美的JWT......除了秘密最右边的数字“1”。

请帮忙。

共有1个答案

吴凯泽
2023-03-14

这与HttpServerUtility的方式有关。UrlTokenEncode工作,emphasis mine:

使用基本64位数字将字节数组编码为其等效的字符串表示形式,这可用于在URL上传输

您会知道,根据其长度,Base64字符串将被附加到末尾的=填充。=不被视为URL安全,因此被替换为表示计数的整数,在本例中为1

您可以通过调试来测试并替换下面的行...

return System.Web.HttpServerUtility.UrlTokenEncode(signature);

...用这个。。。

return Convert.ToBase64String(signature);

...并检查返回值。

您将看到它以一个HttpServerUtility结束。URLTokencode将其替换为1。

 类似资料:
  • 我意识到消息中的前16个字节是IV,所以我从消息中去掉了它们(从消息开始就去掉了垃圾)。但是现在我在消息的末尾得到了随机的5个字节。这些字节是: 其他职能: 消息有没有可能是随机填充的? -----编辑----- 看来规范使用的是ISO10126填充,用“AES/CBC/ISO10126Padding”代替“AES/CBC/NOPadding”。

  • 创建随机盐。 使用SALT加密密码。 保存用户的salt和加密密码。 我想要盐的大小,算法给出作为输入。 我想要解密的原因是,我有一些为应用程序创建的配置文件和一些值是密码,我想要保存为加密的文件和解密时,我想要使用它。 谁能提供一个适当的例子或如何使用它在我自己的方式?我想实现Jasypt在文章中提到的。但没有可用的代码。

  • 我有一个相当标准的应用程序写在Java它也运行查询对数据库。应用程序位于GCP上,数据库位于Atlas上。 出于可以理解的原因,我不想在代码中保留数据库的用户名和密码。 所以我想到的选项1是将用户名和密码作为环境变量传递给GCP中的应用程序容器。 选项2是在GCP中使用秘密管理器,并将我的用户名和密码存储在那里,并将GCP凭据作为环境变量传递给GCP中的应用程序容器。 我的问题是,如果2号选项有附

  • 本文向大家介绍ActionScript 3 0到1之间的随机数,包括了ActionScript 3 0到1之间的随机数的使用技巧和注意事项,需要的朋友参考一下 示例 产生介于0(含)和1(不含)之间的均匀分布的随机数 输出示例: 0.22282187035307288 0.3948539895936847 0.9987191134132445

  • 我在用Java做一个随机替换密码。基本上,程序要求你输入一个句子,你输入这个句子,然后使用随机生成的字母表对它进行加密。用户可以选择加密或解密。然后在屏幕上显示加密的密文。如果用户选择这样做,程序将解密密码并显示原始的纯文本消息。 以下是我目前掌握的信息: 这只是生成随机字母表。不过,我不知道如何实现实际的encrypt方法。我可以自己处理文件IO和对用户的提示。我只是不明白如何创建替换算法。非常

  • 问题内容: 我有两个长度未知的数组,我只想将一个附加到另一个的末尾,即: 我曾尝试使用,但似乎无法使其正常工作。 问题答案: 使用,应类似于以下内容: