.NET关于JWT中RSA数据加密协议
加密协议有哪些
加密协议分为对称加密和非对称加密。对称加密就是将信息使用一个密钥进行加密,解密时使用同样的密钥,同样的算法进行解密。非对称加密,又称公开密钥加密,是加密和解密使用不同密钥的算法,广泛用于信息传输中。
对称加密协议
AES、DES、RC5、RC6等
非对称加密协议
RSA、DSA等
RSA数据加密协议是什么
RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
临时干货分享
C#零基础教程
工欲善其事必先利其器,学习上位机编程的第一步就是学习C#语法。本教程从C#语法认知、搭建开发环境、从零手写代码,各种数据类型运算符逻辑控制等超详细覆盖,都配套了详尽的视频教程和完整的代码案例,编程零基础也能轻松上手!
资料免费自取:
由于内容过多不便呈现, 需要视频教程和配套源码的小伙伴,点击下方卡片!
也可点击下方卡片: 点击后自动复制威芯号,并跳转到威芯。搜索威芯号添加,内容已做打包, 备注知乎
即可免费领取,注意查收!
Winform快捷教程
学完C#语法,下一步就是开始写客户端项目,建立对软件的完整认知。winform是上手最快捷的,本教程从认识Winform开始,从零手写项目,各种控件详细介绍,堪称手把手教你上手winform开发,真的是编程零基础的也能快速上手。
上位机详细资料
有了对C#语法和客户端开发的认知,下一步就是用软件来对接硬件,完成上位机编程,实现交互。学习上位机的重点是协议,本教程既有通信协议基础入门,也有自定义通信方式,还是Modbus和S7通信实战案例,帮你快速获得主流上位机通信实战经验。
资料免费自取:
由于内容过多不便呈现, 需要视频教程和配套源码的小伙伴,点击下方卡片!
也可点击下方卡片: 点击后自动复制威芯号,并跳转到威芯。搜索威芯号添加,内容已做打包, 备注知乎
即可免费领取,注意查收!
WPF零基础教程
上位机开发技能里面,最值钱的其实是WPF技术栈,像小米、特斯拉、比亚迪抢的就是WPF实战经验丰富的。WPF本身难度要高一点,恰好本教程的WPF是大牛老师讲的,既有详尽的WPF基础学习和实践,又有资深大佬的技术视角解读,用心学完,真的能等同于3年的开发经验!
资料免费自取:
由于内容过多不便呈现, 需要视频教程和配套源码的小伙伴,点击下方卡片!
也可点击下方卡片: 点击后自动复制威芯号,并跳转到威芯。搜索威芯号添加,内容已做打包, 备注知乎
即可免费领取,注意查收!
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 中的应用
生成私钥RSA对象
var PrivateKey =@"
-----BEGIN RSA PRIVATE KEY-----
...................................
-----END RSA PRIVATE KEY-----
//生成RSA私钥对象
var rsa = RSA.Create();
var xmlPriKey = PemPrivateKey(PrivateKey);
rsa.ImportParameters(xmlPriKey);
SecurityKey key2 = new RsaSecurityKey(rsa);
//生成JWT密钥,授权
var token = new JwtSecurityToken(
issuer: "GATE",
audience: "API",
expires: exPriseDateTime,
notBefore: DateTime.Now,
claims: claims,
signingCredentials: new SigningCredentials(key2, SecurityAlgorithms.RsaSha256)
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
return jwtToken;
static RSAParameters PemPrivateKey(string pemPrivateKeyStr)
RsaPrivateCrtKeyParameters pemPrivateKey;
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(pemPrivateKeyStr)))
using (var sr = new StreamReader(ms))
//在.net中只支持XML格式的RSA密钥,所以需要借助第三方库才能识别PEM格式的密钥
var pemReader = new Org.BouncyCastle.OpenSsl.PemReader(sr);
var keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
pemPrivateKey = (RsaPrivateCrtKeyParameters)keyPair.Private;
var p = new RSAParameters
Modulus = pemPrivateKey.Modulus.ToByteArrayUnsigned(),
Exponent = pemPrivateKey.PublicExponent.ToByteArrayUnsigned(),
D = pemPrivateKey.Exponent.ToByteArrayUnsigned(),
P = pemPrivateKey.P.ToByteArrayUnsigned(),
Q = pemPrivateKey.Q.ToByteArrayUnsigned(),
DP = pemPrivateKey.DP.ToByteArrayUnsigned(),
DQ = pemPrivateKey.DQ.ToByteArrayUnsigned(),
InverseQ = pemPrivateKey.QInv.ToByteArrayUnsigned(),
return p;
.NET Core中应用
生成私钥RSA对象
var configurationBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
var configuration = configurationBuilder.Build();
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "name"));
claims.Add(new Claim("ID", "123456"));
//生成RSA私钥实例
var rsa = RSA.Create();
//在.net core中原生支持PEM格式的密钥 ,ImportRSAPrivateKey 导入私钥
rsa.ImportRSAPrivateKey(Convert.FromBase64String(configuration.GetSection("Jwt:Prikey").Value), out _);
SecurityKey key2 = new RsaSecurityKey(rsa);
var token = new JwtSecurityToken(
issuer: configuration.GetSection("Jwt:Issuer").Value,
audience: configuration.GetSection("Jwt:Audience").Value,
expires: DateTime.Now.AddDays(1),
notBefore: DateTime.Now,
claims: claims,
signingCredentials: new SigningCredentials(key2, SecurityAlgorithms.RsaSha256)
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
return Task.FromResult(jwtToken);
生成公钥RSA对象
public void ConfigureServices(IServiceCollection services)
.......................
var configurationBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
var configuration = configurationBuilder.Build();
var rsa = RSA.Create();
var pubkey = File.ReadAllText("Public.key").Replace("-----BEGIN RSA PUBLIC KEY-----", "").Replace("-----END RSA PUBLIC KEY-----", "").Replace("\r", "").Replace("\n", "").Replace(" ", "");
//ImportRSAPublicKey 导入公钥
rsa.ImportRSAPublicKey(Convert.FromBase64String(pubkey), out _);
SecurityKey key2 = new RsaSecurityKey(rsa);
services.AddAuthorization(options =>
}).AddAuthentication(options =>
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
options.TokenValidationParameters = new TokenValidationParameters()
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidAudience = configuration.GetSection("Jwt:Audience").Value,
ValidIssuer = configuration.GetSection("Jwt:Issuer").Value,
IssuerSigningKey = key2
.......................
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)