⭐️ Furion v4 版本支持【所有历史版本】无缝升级,一套代码兼容 .NET 5+ ⭐️
Skip to main content

20. 数据加解密

20.1 数据加解密

由于现在的互联网越具发达,数据成为了我们生活的一部分,当然也带来了很多数据安全性的问题,比如用户密码明文存储,用户信息明文存在在浏览器 cookies 中等等不安全操作。

所以,对数据的加解密是系统开发必要的环节。

20.2 内置加密算法

  • MD5 加密
  • DESC 加解密
  • AES 加解密
  • JWT 加解密
  • PBKDF2 加密(Furion v2.12 + 版本已移除)
  • RSA 加解密

20.3 加解密使用

20.3.1 MD5 加密

// 测试 MD5 加密,比较var md5Hash = MD5Encryption.Encrypt("百小僧");  // 加密var isEqual = MD5Encryption.Compare("百小僧", md5Hash); // 比较return (md5Hash, isEqual);// 输出大写 MD5 加密var md5Hash = MD5Encryption.Encrypt("百小僧", true);// 输出 16位 MD5 加密,Furion 4.2.6+ 版本var md5Hash16 = MD5Encryption.Encrypt("百小僧", is16: true);

20.3.2 DESC 加解密

// 测试 DESC 加解密var descHash = DESCEncryption.Encrypt("百小僧", "Furion"); // 加密var str = DESCEncryption.Decrypt(descHash, "Furion");  // 解密return (descHash, str);

20.3.3 AES 加解密

// 测试 AES 加解密var key = Guid.NewGuid().ToString("N"); // 密钥,长度必须为24位或32位var aesHash = AESEncryption.Encrypt("百小僧", key); // 加密var str2 = AESEncryption.Decrypt(aesHash, key); // 解密return (aesHash, str2);

20.3.4 JWT 加解密

var token = JWTEncryption.Encrypt(new Dictionary<string, object>()  // 加密            {                { "UserId", user.Id },                { "Account",user.Account }            });var tokenData = JWTEncryption.ReadJwtToken("你的token");  // 解密var (isValid, tokenData) = JWTEncryption.Validate("你的token"); // 验证token有效期
特别注意

JWTEncryption 加解密并未包含在 Furion 框架中,需要安装 Furion 框架提供的 Furion.Extras.Authentication.JwtBearer 拓展包。

20.3.5 PBKDF2 加密

Furion v2.12 + 版本已移除。

// 测试 PBKDF2 加密,比较var basestring = PBKDF2Encryption.Encrypt("百小僧");  // 加密var isEqual = PBKDF2Encryption.Compare("百小僧", basestring); // 比较
支持选择更多参数

PBKDF2 还可以配置更多参数:

  • Startup.cs 中注册服务
services.AddPBKDF2EncryptionOptions();
  • appsettings.json 配置:
{  "PBKDF2EncryptionSettings": {    "InitialIterationCount": 110, // 初始迭代次数累加值    "KeyDerivation": "HMACSHA256", // 加密算法规则  KeyDerivationPrf.HMACSHA256    "NumBytesRequested": 64 // 派生密钥的长度 (以字节为单位) 512 / 8  }}
  • KeyDerivation 可选值有:HMACSHA1HMACSHA256HMACSHA512

20.3.6 RSA 加密

// 测试 RSA 加密var (publicKey, privateKey) = RSAEncryption.GenerateSecretKey(2048);  //生成 RSA 秘钥 秘钥大小必须为 2048 到 16384,并且是 8 的倍数var basestring = RSAEncryption.Encrypt("百小僧", publicKey);  // 加密var str2 = RSAEncryption.Decrypt(basestring, privateKey); // 解密return (basestring, str2);
关于 RSA 签名和校验

Furion 框架底层不内置 RSA 签名和校验功能,如需添加该功能可查阅开发者提交的代码:查看 RSA 签名和校验

20.4 字符串拓展方式

Furion 框架也提供了字符串拓展方式进行 MD5加密、AES/DESC加解密、RSA加解密

using Furion.DataEncryption.Extensions;// MD5 加密var s = "Furion".ToMD5Encrypt();var b = "Furion".ToMD5Compare(s);   // 比较// AES加解密var s = "Furion".ToAESEncrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");var str = s.ToAESDecrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");// DESC 加解密var s = "Furion".ToDESCEncrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");var str = s.ToDESCDecrypt("sfdsfdsfdsfdsfdsfdsfdsfdsfdfdsfdsfdfdfdfd");// PBKDF2 加密(`Furion v2.12 +` 版本已移除!!!!!!!!)var s = "Furion".ToPBKDF2Encrypt();var b = "Furion".ToPBKDF2Compare(s);   // 比较// RSA 加解密var (publicKey, privateKey) = RSAEncryption.GenerateSecretKey(2048);  //生成 RSA 秘钥 秘钥大小必须为 2048 到 16384,并且是 8 的倍数var s= "Furion".ToRSAEncrpyt(publicKey);  // 加密var str=s.ToRSADecrypt(privateKey);  // 解密

20.5 SM2SM3SM4 国密

Furion 框架未内置国密算法 SM2-4,但是已有开发者贡献实现并开源,可查阅 Gitee 仓库,感谢 QQ(373696184)形影相印²º²² 贡献

var data = "{\"lx\":\"1\",\"wxid\":\"\",\"ehealth_code_id\":\"68A018036186B717CC1B051C10996F4EEE805F5F81EB1594C9EB43592545F7F6\",\"ehealth_code\":\"68A018036186B717CC1B051C10996F4EEE805F5F81EB1594C9EB43592545F7F6\",\"xm\":\"测试\"}";// SM2var b = SM2Utils.加密("123");var b1 = SM2Utils.解密(b);// SM3 一般用于数字签名var sM3Utils = new SM3Utils();sM3Utils.secretKey = "ASAFSDFDSGSDFSDFSDFSFSF";var token= sM3Utils.加密("123");// SM4var sM4Utils = new SM4Utils();sM4Utils.secretKey = "BDBDBDBDBDBDBDBDBDBDBDBDBDBDBD";var a = sM4Utils.加密(data);var a1 = sM4Utils.解密(a);

20.6 反馈与建议

与我们交流

给 Furion 提 Issue

演练场