在很多 C# 项目里,加密这块经常是“能用就行”:
- 密码直接明文传?❌
- AES 一把梭?❌
- RSA 只会用不会原理?❌
结果就是:安全性看起来做了,其实漏洞一堆。
这篇文章不讲空理论,直接从官方实现 → 实战代码 → 生产经验,带你把 RSA 真正用对。
一、官方实现:.NET 原生就支持 RSA
很多人第一步就错了:一上来就找 NuGet 包。
其实完全没必要。
👉 在.NET里,RSA 是原生支持的:
using System.Security.Cryptography;创建方式也很简单:
using RSA rsa = RSA.Create(2048);✔ RSA 是什么?
公钥加密,私钥解密
- 公钥:可以给前端
- 私钥:必须后端保存
👉 这点非常关键:前后端不需要共享密钥
✔ 官方推荐写法(避坑重点)
❌ 老写法(不推荐):
RSACryptoServiceProvider👉 原因:
- 使用 SHA-1(不安全)
- API 已过时
✔ 新写法(推荐):
rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA256);👉 重点:
- 使用 OAEP
- 使用 SHA256(安全)
二、NuGet 到底要不要装?
RSA 已经内置在:
System.Security.Cryptography✔ 什么时候需要?
1️⃣ 多语言兼容
👉 用:
- BouncyCastle
适合:
- Java / JS / C# 混合系统
- PEM 格式处理
2️⃣ Token / 登录体系
👉 用:
- System.IdentityModel.Tokens.Jwt
👉 但核心建议:
能用官方就用官方,第三方只是补充
三、实战:RSA 加密解密(直接能用)
1️⃣ 生成密钥
using RSA rsa = RSA.Create(2048); byte[] publicKey = rsa.ExportRSAPublicKey(); byte[] privateKey = rsa.ExportRSAPrivateKey();2️⃣ 加密(公钥)
byte[] data = Encoding.UTF8.GetBytes("敏感数据"); byte[] encrypted = rsa.Encrypt( data, RSAEncryptionPadding.OaepSHA256 );3️⃣ 解密(私钥)
byte[] decrypted = rsa.Decrypt( encrypted, RSAEncryptionPadding.OaepSHA256 ); string result = Encoding.UTF8.GetString(decrypted);四、核心认知:RSA 不是用来“加密数据”的
很多人最大误区就在这里。
👉 RSA 的本质是:
解决“密钥如何安全传输”❗ 为什么?
因为:
2048位 RSA ≈ 最多加密 245 字节
👉 你用它加文件?直接炸。
✔ 正确姿势(企业标准)
RSA + AES 混合加密
流程:
① 生成 AES 密钥
② 用 RSA 加密 AES 密钥
③ 用 AES 加密数据
五、登录场景(你项目正在用的)
标准流程👇
① 请求获取公钥
② 前端加密 openid / password
③ 后端用私钥解密
④ 生成 Token
👉 优点:
- 防抓包
- 防明文
- 提升安全
六、你很可能踩过的坑(真实项目)
❌ 坑1:每次请求都生成 RSA
结果:
- 数据库爆炸
- 登录逻辑异常
✔ 正确做法:
- 公钥加过期时间(5~10分钟)
- 或缓存(Redis)
❌ 坑2:前后端 padding 不一致
RSAEncryptionPadding.OaepSHA256
👉 前端必须一致,否则:
👉直接解密失败
❌ 坑3:私钥乱存
最危险行为:
写死在代码 / config
七、最佳实践总结
✔ RSA 只用于小数据(登录、token)
✔ 大数据用 AES
✔ 使用 OAEP + SHA256
✔ 密钥必须有生命周期
✔ 私钥绝不能泄露
八、一句话总结
👉RSA 解决的不是“加密强度”,而是“密钥分发安全”
当你真正理解这一点,就不会再把它当成“万能加密工具”,而是作为整个安全体系中的关键一环。
在实际项目中,只有把RSA、AES、Token、密钥管理组合起来,才能构建出一套真正可靠的安全方案。