我到处寻找解决我问题的办法,但似乎找不到。
我有一个类,它利用方法创建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”。
请帮忙。
这与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和对用户的提示。我只是不明白如何创建替换算法。非常
问题内容: 我有两个长度未知的数组,我只想将一个附加到另一个的末尾,即: 我曾尝试使用,但似乎无法使其正常工作。 问题答案: 使用,应类似于以下内容: