有啥方法可以创建密钥大小为 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 位密钥(公钥私钥对)是不是足够安全
sh 使用openssl为JWT JWK(JSON Web Token JSON Web Key)生成ES512和RS256椭圆曲线密钥对