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
可选值有:HMACSHA1
,HMACSHA256
,HMACSHA512
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 SM2
、SM3
,SM4
国密
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。