有啥方法可以创建密钥大小为 512 的 JWT 令牌?并更改 AsymmetricSignatureProvider 的默认最小尺寸要求

Posted

技术标签:

【中文标题】有啥方法可以创建密钥大小为 512 的 JWT 令牌?并更改 AsymmetricSignatureProvider 的默认最小尺寸要求【英文标题】:Any way to create a JWT token with key size 512? and changing default minimum size requirement of AsymmetricSignatureProvider有什么方法可以创建密钥大小为 512 的 JWT 令牌?并更改 AsymmetricSignatureProvider 的默认最小尺寸要求 【发布时间】:2020-06-21 06:30:37 【问题描述】:

我目前收到以下错误:

IDX10630:'Microsoft.IdentityModel.Tokens.RsaSecurityKey,KeyId:'...',InternalId:'5a946596-9fe6-4c91-8c52-9b140849c7a4'。签名不能小于“2048”位。密钥大小:'512'

我使用以下方法:

 public string GetIdTokenString(Dictionary<string, string> inputClaims, string privateKey)
        
            string result = null;
            try
            
                var tokenHandler = new JwtSecurityTokenHandler();                
                privateKey = privateKey.Replace("-----BEGIN ENCRYPTED PRIVATE KEY-----", String.Empty).Replace("-----END ENCRYPTED PRIVATE KEY-----", String.Empty);
                var privateKeyBytes = Convert.FromBase64String(privateKey);
                byte[] privateKeyPasswordBytes = Encoding.UTF8.GetBytes(mypassword);
                List<Claim> claims = new List<Claim>();
                foreach (var o in inputClaims)
                                    
                    claims.Add(new Claim(o.Key, o.Value));
                
                int length = 0;
                RSA rSA = RSA.Create();
                rSA.ImportEncryptedPkcs8PrivateKey(privateKeyPasswordBytes, privateKeyBytes, out length);
                RsaSecurityKey securitykey = new RsaSecurityKey(rSA)
                
                    KeyId = "......"
                ;
                var tokenDescriptor = new SecurityTokenDescriptor
                
                    Subject = new ClaimsIdentity(claims),
                    Expires = DateTime.UtcNow.AddSeconds(60 * 5),
                    Audience = ...,
                    Issuer = .....                   

                ;
                tokenDescriptor.SigningCredentials = new SigningCredentials(securitykey, SecurityAlgorithms.RsaSha256Signature);

                var token = tokenHandler.CreateToken(tokenDescriptor);


                if (token != null && token is JwtSecurityToken)
                
                    result = (token as JwtSecurityToken).RawData;
                
            
            catch (Exception ex)
            
                Logger.Fatal(ex);
            
            return result;
        

帖子里提到了一段代码

Error Creating JWT Token using RSA Security Key with key size less than 2048

但我无法在 .net core 3.1 中运行它

还有一件事是关于在 AsymmetricSignatureProvider.DefaultMinimumAsymmetricKeySizeInBitsForSigningMap

有什么方法可以改变特定键的值?

我试过但没用的一件事是

 var mainclass = typeof(AsymmetricSignatureProvider)
                .GetField(nameof(AsymmetricSignatureProvider.DefaultMinimumAsymmetricKeySizeInBitsForSigningMap), BindingFlags.Public | BindingFlags.Static );
                var field = mainclass.GetValue(null) as Dictionary<string, int>;
                if (field != null)
                
                    field["RS256"] = 512;
                

                var mainclass2 = typeof(AsymmetricSignatureProvider).GetField(nameof(AsymmetricSignatureProvider.DefaultMinimumAsymmetricKeySizeInBitsForVerifyingMap), BindingFlags.Public | BindingFlags.Static);
                var field2 = mainclass2.GetValue(null) as Dictionary<string, int>;
                if (field2 != null)
                
                    field2["RS256"] = 512;
                

【问题讨论】:

现在你为什么认为他们不会接受小于 2048 的密钥? 他们?我正在支持一个遗留应用程序,其中密钥生成是当前生成大小为 512 的密钥的旧组件的责任。我必须利用该密钥来生成和验证 id 令牌 【参考方案1】:

以下是我使用的解决方案

var mainclass = typeof(AsymmetricSignatureProvider)
                       .GetField(nameof(AsymmetricSignatureProvider.DefaultMinimumAsymmetricKeySizeInBitsForSigningMap), BindingFlags.Public | BindingFlags.Static);
                var field = mainclass.GetValue(null) as Dictionary<string, int>;
                if (field != null)
                
                    field["RS256"] = 512;

                

                var mainclass2 = typeof(AsymmetricSignatureProvider).GetField(nameof(AsymmetricSignatureProvider.DefaultMinimumAsymmetricKeySizeInBitsForVerifyingMap), BindingFlags.Public | BindingFlags.Static);
                var field2 = mainclass2.GetValue(null) as Dictionary<string, int>;
                if (field2 != null)
                
                    field2["RS256"] = 512;
                

【讨论】:

以上是关于有啥方法可以创建密钥大小为 512 的 JWT 令牌?并更改 AsymmetricSignatureProvider 的默认最小尺寸要求的主要内容,如果未能解决你的问题,请参考以下文章

JWT(NodeJS)的 512 位密钥(公钥私钥对)是不是足够安全

JAVA 代码生成与 JWT 一起使用的 HS512 密钥

sh 使用openssl为JWT JWK(JSON Web Token JSON Web Key)生成ES512和RS256椭圆曲线密钥对

使用密钥大小小于 2048 的 RSA 安全密钥创建 JWT 令牌时出错

JWT RS256、RS384、RS512算法有啥区别?

HMAC 256 与 HMAC 512 JWT 签名加密