❤️ 关注 Furion 微信公众号有惊喜哦!
Skip to main content

20. 数据加解密

📝 模块更新日志
  • 新特性

    •   AES 支持对文件(含超大文件)进行加解密 4.8.8.11 ⏱️2023.05.05 1d2265b
    •   RSA 支持对超长字符(超 245 位)进行分段加解密 4.8.8.2 ⏱️2023.04.19 !788 感谢 @YaChengMu
    •   byte[] 类型 MD5 加密/比较重载方法 4.8.6.3 ⏱️2023.02.15 #I6F1NT

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);

// Furion 4.8.6.3+ 版本支持 byte[] 类型,如获取文件 MD5 Hash
var bytes = File.ReadAllBytes("image.png");
var md5Hash = MD5Encryption.Encrypt(bytes); // 加密
var isEqual = MD5Encryption.Compare(bytes, md5Hash); // 比较

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);
版本说明

以下内容仅限 Furion 4.8.8.11 + 版本使用。

  • 对文件(含超大文件)进行加解密
// 加密
var originBytes = File.ReadAllBytes("xxx.rar"); // 读取源文件内容
var encryptBytes = AESEncryption.Encrypt(originBytes, "123456");
// 可以通过 encryptBytes.CopyToSave("xxx.加密.rar"); 保存到磁盘

// 解密
var encryptBytes = File.ReadAllBytes("xxx.加密.rar"); // 读取加密文件内容
var originBytes = AESEncryption.Decrypt(encryptBytes, "123456");
// 可以通过 originBytes.CopyToSave("xxx.真实.rar"); 保存到磁盘

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, validationResult) = 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); // 比较
// Furion 4.8.6.3+ 支持 bytes
var b = bytes.ToMD5Encrypt();
var z = bytes2.ToMD5Compare(bytes);

// 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\":\"测试\"}";

// SM2
var b = SM2Utils.加密("123");
var b1 = SM2Utils.解密(b);

// SM3 一般用于数字签名
var sM3Utils = new SM3Utils();
sM3Utils.secretKey = "ASAFSDFDSGSDFSDFSDFSFSF";
var token= sM3Utils.加密("123");

// SM4
var sM4Utils = new SM4Utils();
sM4Utils.secretKey = "BDBDBDBDBDBDBDBDBDBDBDBDBDBDBD";

var a = sM4Utils.加密(data);
var a1 = sM4Utils.解密(a);

20.6 反馈与建议

与我们交流

给 Furion 提 Issue