首页 > 其他分享 >升级.Net8后Jwt密钥长度要求大于32的问题

升级.Net8后Jwt密钥长度要求大于32的问题

时间:2024-06-21 16:57:40浏览次数:25  
标签:return algorithm 32 args Jwt alg Net8 new null

原因

  前段时间将项目升级到.net8后,提示jwt密钥长度太短了,这咋办,我

解决

  1.  最简单的办法,把密钥长度加长

  2.  如果你的项目只需要验证token,而不需要生成,就:

  

SymmetricSecurityKey ExtendKeyLengthIfNeeded(SymmetricSecurityKey key, int minLenInBytes) {
    if (key != null && key.KeySize < (minLenInBytes * 8)) {
        var newKey = new byte[minLenInBytes]; // zeros by default
        key.Key.CopyTo(newKey, 0);
        return new SymmetricSecurityKey(newKey);
    }
    return key;
}
// 添加jwt服务时加到jwt配置里去
jwtParams.IssuerSigningKeyResolver = (tokenString, securityToken, identifier, parameters) => { string alg = null; if (securityToken is JwtSecurityToken jwtSecurityToken) alg = jwtSecurityToken.SignatureAlgorithm; if (securityToken is Microsoft.IdentityModel.JsonWebTokens.JsonWebToken jsonWebToken) alg = jsonWebToken.Alg; if (parameters.IssuerSigningKey is SymmetricSecurityKey symIssKey && alg!=null) { // workaround for breaking change in "System.IdentityModel.Tokens.Jwt 6.30.1+ switch (alg?.ToLowerInvariant()) { case "hs256": return new[] { ExtendKeyLengthIfNeeded(symIssKey, 32) }; case "hs512": return new[] { ExtendKeyLengthIfNeeded(symIssKey, 64) }; } } return new[] { parameters.IssuerSigningKey };
};

  这个方法来源于下面这个连接,如果有不理解的可以研究

  来源:c# - Migrating existing API project to .NET 8 getting error when creating JWT tokens - Stack Overflow

  3.  如果你的项目既要还要,那就:

  那就要研究以下源码了,大概翻了下哪里会抛出” IDX10720 “ 异常,发现只有一个地方

  这段代码太多就不展示了,有时间可以自己去看

  抛异常的源码地址:azure-activedirectory-identitymodel-extensions-for-dotnet/src/Microsoft.IdentityModel.Tokens/CryptoProviderFactory.cs at c24bfe683427dbad566fe617d0d590ec3a61d8aa · AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet (github.com)

  看了代码后发现是可以绕过检查的,可以自定义一个加密类型,这样就管不着了

  下面这段代码定义了一个加密方法,其实还是用的HmacSha256,就为了跳过检查

public class ShortHS256KeyCryptoProvider : ICryptoProvider
{
    public object Create(string algorithm, params object[] args)
    {
        if (args is null || args.Length == 0)
            return null;
        if (args[0] is SecurityKey)
            return null;
        if (!algorithm.Equals(SecurityAlgorithms.HmacSha256Signature, StringComparison.OrdinalIgnoreCase)
            && !algorithm.Equals(SecurityAlgorithms.HmacSha256, StringComparison.OrdinalIgnoreCase))
            return null;

        return new HMACSHA256(args[0] as byte[]);
    }

    public bool IsSupportedAlgorithm(string algorithm, params object[] args)
    {
        if(args is null || args.Length == 0)
            return false;
        if (args[0] is SecurityKey)
            return false;
        if(!algorithm.Equals(SecurityAlgorithms.HmacSha256Signature, StringComparison.OrdinalIgnoreCase)
            && !algorithm.Equals(SecurityAlgorithms.HmacSha256, StringComparison.OrdinalIgnoreCase))
            return false;
        return true;
    }

    public void Release(object cryptoInstance)
    {
        if (cryptoInstance is IDisposable disposableObject)
            disposableObject.Dispose();
    }
}

  然后在找个地方把自定义的加密添加到jwt里面去,就下面这句代码:

CryptoProviderFactory.Default.CustomCryptoProvider = new ShortHS256KeyCryptoProvider();

  最后收工!!!

 

  

 

标签:return,algorithm,32,args,Jwt,alg,Net8,new,null
From: https://www.cnblogs.com/zhouyuguang/p/18260862

相关文章

  • JWT登录认证
    JWT登录认证导入jwt依赖<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>写个jwt工具类publicclassJwtUtil{//有......
  • .NET 6 Swagger+JWT 配置
    1.1封装一个SwaggerExtend类(包含JWT配置)///<summary>///Swagger静态类///</summary>publicstaticclassSwaggerExtend{///<summary>///添加服务:swagger///</summary>///<paramname=&qu......
  • 闲鱼面试:说说JWT工作原理?
    JWT(JSONWebToken)一种开放的标准规范(RFC7519),用于在网络上安全的传输信息,通常被用于身份验证。简单来说,你可以把JWT想象成一张小巧的、自包含的电子通行证。这张通行证里面包含了用户的身份信息,就像你在某个俱乐部的会员卡,上面有你的名字、会员等级等信息,拿着这张卡,你就能证......
  • 基于STM32F103 HAL库 开发PWM读取
    目录CubeMX配置调试配置​时钟配置​编辑定时器配置打开定时器捕获中断代码readpwm.hreadpwm.cCubeMX配置调试配置时钟配置定时器配置测已知周期的占空比,我们要读取的PWM周期是20ms,于是我设计预分频系数是72-1,自动重装载系数是40000-1,周期是40ms,存在两个完整......
  • STM32同步通信与异步通信的区别及特点
    1.同步通信同步通信是指通信双方在通信过程中需要使用同步信号进行同步,以确保数据的正确传输。STM32的同步通信主要有两种方式:SPI和I2C。-SPI(SerialPeripheralInterface):SPI是一种高速的同步串行通信协议,它可以实现STM32与外设之间的高速数据传输。SPI通信需要使用4根线:时钟......
  • 通过获取的jwt认证token,实现自动登录django-admin后台
    视图层fromrest_framework_simplejwt.tokensimportAccessTokenfromdjango.middleware.csrfimportget_tokenfromdjango.contrib.authimportloginclassJwtToSessionView(GenericViewSet):@action(methods=['GET'],detail=False)defset(self,......
  • Proteus仿真实例_基于STM32单片机的公园长椅系统(仿真文件+程序)24-32f-10
    一.系统概述本次设计的公园座椅是以STM32单片机作为核心控制器,可以控制音乐播放(通过虚拟串口调试助手模拟即可),可以完成对雨滴的采集,当检测到雨滴的时候控制继电器闭合模拟遮雨,可以控制心率传感器完成对心率采集,当心率超过闹值则控制蜂鸣器报警,设计有温度采集功能,当温度低......
  • 032java jsp ssm大学生第二课堂成绩单系统学生思想道德技术修养文体活动管理(源码+数据
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • Windows11系统win32ui.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个win32ui.dll文件(挑选合适的版本文件)把它放......
  • 【题解】P6323 | 容斥 分拆数
    本题存在低于\(O(nc)\)的做法。逆序对是大小关系,我们在小的那个数处统计每对逆序对,考虑从大到小插入每一个数,这样所有数都比他大,这样它插入在第\(i\)个就会产生\(i\)个逆序对,假设现在有\(x\)个数则它可以产生\([0,x]\)中个逆序对,且每种都恰好有一种插法。那么我们现在......