关于JWT中RSA数据加密协议在.net中应用

守听  论坛元老 | 2022-12-5 22:08:56 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1027|帖子 1027|积分 3081

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
加密协议有哪些

加密协议分为对称加密和非对称加密。
对称加密就是将信息使用一个密钥进行加密,解密时使用同样的密钥,同样的算法进行解密。
非对称加密,又称公开密钥加密,是加密和解密使用不同密钥的算法,广泛用于信息传输中。
对称加密协议

AES、DES、RC5、RC6等
非对称加密协议

RSA、DSA等
RSA数据加密协议是什么

RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
RSA加密协议的原理

对极大整数做因数分解。可以在不直接传递密钥的情况下完成解密。可以确保信息的安全性,避免了直接传递密钥所造成的被破解的风险,RSA是由一对密钥来进行加解密的过程,分别称为公钥和私钥.
RSA格式

通常PKCS1密钥对的开始部分为:
-----BEGIN RSA PRIVATE KEY-----或
-----BEGIN RSA PUBLIC KEY-----
而PKCS8密钥对的开始部分为:
-----BEGIN PRIVATE KEY----- 或
-----BEGIN ENCRYPTED PRIVATE KEY----- 或
-----BEGIN PUBLIC KEY-----
这种包含开头和结尾标记的是PEM密钥格式,但在.net中只支持XML格式,可以通过第三方库BouncyCastle,将PEM和XML格式互转
RSA密钥的生成

密钥可以在线生成,推荐选择密钥长度大于等于2024位,因为目前已经破解了接近1024位了。格式选择PKCS1。
在.Net中的应用

.Net中应用

生成私钥RSA对象

点击查看代码
  1.             var PrivateKey =@"
  2.                         -----BEGIN RSA PRIVATE KEY-----
  3.                         ...................................
  4.                         -----END RSA PRIVATE KEY-----
  5.             ";
  6.             //生成RSA私钥对象
  7.             var rsa = RSA.Create();
  8.             var xmlPriKey = PemPrivateKey(PrivateKey);
  9.             rsa.ImportParameters(xmlPriKey);
  10.             SecurityKey key2 = new RsaSecurityKey(rsa);
  11.             //生成JWT密钥,授权
  12.             var token = new JwtSecurityToken(
  13.                 issuer: "GATE",
  14.                 audience: "API",
  15.                 expires: exPriseDateTime,
  16.                 notBefore: DateTime.Now,
  17.                 claims: claims,
  18.                 signingCredentials: new SigningCredentials(key2, SecurityAlgorithms.RsaSha256)
  19.                 );
  20.             var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
  21.             return jwtToken;
  22.         static RSAParameters PemPrivateKey(string pemPrivateKeyStr)
  23.         {
  24.             RsaPrivateCrtKeyParameters pemPrivateKey;
  25.             using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(pemPrivateKeyStr)))
  26.             {
  27.                 using (var sr = new StreamReader(ms))
  28.                 {
  29.                     //在.net中只支持XML格式的RSA密钥,所以需要借助第三方库才能识别PEM格式的密钥
  30.                     var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(sr);
  31.                     var keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
  32.                     pemPrivateKey = (RsaPrivateCrtKeyParameters)keyPair.Private;
  33.                 }
  34.             }
  35.             var p = new RSAParameters
  36.             {
  37.                 Modulus = pemPrivateKey.Modulus.ToByteArrayUnsigned(),
  38.                 Exponent = pemPrivateKey.PublicExponent.ToByteArrayUnsigned(),
  39.                 D = pemPrivateKey.Exponent.ToByteArrayUnsigned(),
  40.                 P = pemPrivateKey.P.ToByteArrayUnsigned(),
  41.                 Q = pemPrivateKey.Q.ToByteArrayUnsigned(),
  42.                 DP = pemPrivateKey.DP.ToByteArrayUnsigned(),
  43.                 DQ = pemPrivateKey.DQ.ToByteArrayUnsigned(),
  44.                 InverseQ = pemPrivateKey.QInv.ToByteArrayUnsigned(),
  45.             };
  46.             return p;
  47.         }
复制代码
.Net Core中应用

生成私钥RSA对象

点击查看代码
  1. var Jwt:Prikey = "去掉开头和结束的标记,以及换行和空格符".replace("\r","").replace("\n","").replace(" ","").replace("BEGIN RSA PRIVATE KEY","").replace("END RSA PRIVATE KEY","");
  2. [AllowAnonymous]
  3.         public Task<string> GetToken()
  4.         {
  5.             var configurationBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
  6.             var configuration = configurationBuilder.Build();
  7.             List<Claim> claims = new List<Claim>();
  8.             claims.Add(new Claim(ClaimTypes.Name, "name"));
  9.             claims.Add(new Claim("ID", "123456"));
  10.             //生成RSA私钥实例
  11.             var rsa = RSA.Create();
  12.             //在.net core中原生支持PEM格式的密钥 ,ImportRSAPrivateKey 导入私钥
  13.             rsa.ImportRSAPrivateKey(Convert.FromBase64String(configuration.GetSection("Jwt:Prikey").Value), out _);
  14.             SecurityKey key2 = new RsaSecurityKey(rsa);
  15.             var token = new JwtSecurityToken(
  16.                 issuer: configuration.GetSection("Jwt:Issuer").Value,
  17.                 audience: configuration.GetSection("Jwt:Audience").Value,
  18.                 expires: DateTime.Now.AddDays(1),
  19.                 notBefore: DateTime.Now,
  20.                 claims: claims,
  21.                 signingCredentials: new SigningCredentials(key2, SecurityAlgorithms.RsaSha256)
  22.                 );
  23.             var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
  24.             return Task.FromResult(jwtToken);
  25.         }
复制代码
生成公钥RSA对象

点击查看代码
  1. public void ConfigureServices(IServiceCollection services)
  2.         {
  3.             .......................
  4.             var configurationBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
  5.             var configuration = configurationBuilder.Build();
  6.             var rsa = RSA.Create();
  7.             var pubkey = File.ReadAllText("Public.key").Replace("-----BEGIN RSA PUBLIC KEY-----", "").Replace("-----END RSA PUBLIC KEY-----", "").Replace("\r", "").Replace("\n", "").Replace(" ", "");
  8.             //ImportRSAPublicKey  导入公钥
  9.             rsa.ImportRSAPublicKey(Convert.FromBase64String(pubkey), out _);
  10.             SecurityKey key2 = new RsaSecurityKey(rsa);
  11.             services.AddAuthorization(options =>
  12.             {
  13.             }).AddAuthentication(options =>
  14.             {
  15.                 options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
  16.                 options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
  17.             }).AddJwtBearer(options =>
  18.             {
  19.                 options.TokenValidationParameters = new TokenValidationParameters()
  20.                 {
  21.                     ValidateIssuer = true,
  22.                     ValidateAudience = true,
  23.                     ValidateLifetime = true,
  24.                     ValidateIssuerSigningKey = true,
  25.                     ValidAudience = configuration.GetSection("Jwt:Audience").Value,
  26.                     ValidIssuer = configuration.GetSection("Jwt:Issuer").Value,
  27.                     IssuerSigningKey = key2
  28.                 };
  29.             });
  30.           .......................
  31.         }
  32.                
  33.         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  34.         {
  35.             .......................
  36.             app.UseAuthentication();
  37.             app.UseAuthorization();
  38.             .......................
  39.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表