最近在通过实践来完善自己的理论知识
发现自己会说的时候,只是明白了片面的运行,当自己操作起来后,才发现所谓自己认为的东西可能有纰漏,接下来 言归正传
使用JWT是为了对用户的账号进行安全的防范,从而起到保护用户个人账号也保护了程序的安全
JWT分为几步骤:
- 创建秘钥,通过程序中固定的秘钥,对每个用户生成自己的Token令牌,这个令牌不会进行传输也不会暴露,除非程序被拔走等;
在配置中存放秘钥等固定的信息
- 生成JWT程序逻辑类并在此类所在的库中引用JWT使用的NuGet包文件(如果使用一下的代码需要引用这两项包)
- 这个是我扒过来的代码,使用的HmacSha256算法
public string GetToken(string name)
{
var signingAloorithm = SecurityAlgorithms.HmacSha256;//Header 选择签名算法
var claims = new[] {
new Claim(JwtRegisteredClaimNames.Sub,"userId")
};//载荷payload 存放用户信息以及Id;
//signature
var secretByte = Encoding.UTF8.GetBytes(configuration["AuthenticationDemo:SecretKeyDemo"]);
//使用非杜晨算法对私钥进行加密
var signingKey= new SymmetricSecurityKey(secretByte);
//使用HmacSha256来验证加密后的私钥生成数字签名
var signingCreadentials = new SigningCredentials(signingKey, signingAloorithm);
//生成Token
var Tokens = new JwtSecurityToken(
issuer: configuration["AuthenticationDemo:IssuerDemo"], //发布者
audience: configuration["AuthenticationDemo:AudienceDemo"], //接受者
claims: claims, //存放的用户信息
notBefore: DateTime.Now, //发布时间
expires:DateTime.UtcNow.AddDays(1), //有效期设置为1天
signingCreadentials //数字签名
);
//生成字符串token
var TokenStr = new JwtSecurityTokenHandler().WriteToken(Tokens);
return TokenStr;
}
注意:
这里我遇到了一个坑,HS256它的算法使用的256字节(32位)编码格式,所以你的秘钥一定要超过或者等于32位,应为是一个字母一位,一个汉字2位,使用汉字是可以的(本人已尝试),如果少了回报一下问题
Char GPT解释:
-
密钥大小不符合要求:根据错误消息中的信息,使用的密钥算法是 ‘HS256’,它要求密钥的大小必须大于 256 位(32 字节)。然而,提供的密钥大小为 224 位(28 字节),不符合要求。你需要提供一个 256 位或更长的密钥进行正确的操作。
-
密钥字节参数错误:根据错误消息中提到的 ‘Parameter ‘keyBytes’’,似乎在密钥的字节数组参数上出现了错误。可能是提供的字节数组长度与密钥算法不匹配,或者在传递密钥时发生了其他错误。
要解决这个问题,你可以采取以下步骤:
- 确保提供的密钥的大小符合算法的要求。对于 ‘HS256’ 算法,建议使用 256 位(32 字节)的密钥长度。
- 确保提供的密钥以正确的形式传递给密钥算法,可能需要将密钥从其他格式(如字符串)转换为字节数组,并确保字节数组的长度正确。
如果你的密码会出现在Token中,建议将密码进行加密后再进行Token生成,这样就算是安心了!!!
以上是JWT相关的资料希望对各位有帮助!!!