1、创建一个项目,添加引用
EntityFrameworkCore.DataEncryption Pomelo.EntityFrameworkCore.MySql
EntityFrameworkCore.DataEncryption就是我们今天要介绍的主角。
2、建表,我模拟一个用户表,表结构如下
CREATE TABLE `userinfo` ( `UserId` varchar(50) NOT NULL, `UserName` varchar(255) DEFAULT NULL, `Age` int(11) DEFAULT NULL, `BankNum` varchar(500) DEFAULT NULL, PRIMARY KEY (`UserId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中BankNum是银行账号,注意,因为要存储加密字符串,所以字段长度要留长一点
3、项目中创建一个userinfo的实体类
public class UserInfo { /// <summary> ///用户ID /// </summary> [Key] public string UserId { get; set; } /// <summary> ///用户名 /// </summary> public string UserName { get; set; } /// <summary> ///用户年龄 /// </summary> public int Age { get; set; } /// <summary> ///银行卡号 /// </summary> [Encrypted] public string BankNum { get; set; } }
在BankNum上我们加了EncryptedAttribute,表示这个字段需要加密;
4、创建TestContext,添加构造函数,并在OnModelCreating方法中配置我们加密的provider
using System; using System.Text; using DataEncryptionDemo.Entitys; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.DataEncryption; using Microsoft.EntityFrameworkCore.DataEncryption.Providers; namespace DataEncryptionDemo { public class TestContext : DbContext { private readonly byte[] _encryptionKey = Encoding.Default.GetBytes("4A7D1ED414474E4033AC29CCB8653D9B"); private readonly byte[] _encryptionIV = Encoding.Default.GetBytes("0019DA6F1F30D07C51EBC5FCA1AC7DA6".Substring(0,16)); private readonly IEncryptionProvider _provider; public TestContext() { this._provider = new AesProvider(this._encryptionKey, this._encryptionIV); } /// <summary> ///配置 /// </summary> protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var connectionString = "server=127.0.0.1;port=3306; user id=root; password=123456;database=test;"; var serverVersion = new MySqlServerVersion(new Version(5, 7, 30)); optionsBuilder.UseMySql(connectionString,serverVersion); } /// <summary> ///用户表对象 /// </summary> public DbSet<UserInfo> UserInfo { get; set; } /// <summary> ///实体对象的配置 /// </summary> protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.UseEncryption(this._provider); } } }
到这里就开发完成了,是不是还挺简单
5、试一下
TestContext context = new TestContext(); UserInfo zhangsan = new UserInfo { UserId = Guid.NewGuid().ToString(), UserName = "张三", Age =15,BankNum = "123456789101112131415"}; UserInfo lisi = new UserInfo { UserId = Guid.NewGuid().ToString(), UserName = "李四", Age = 20, BankNum = "987654312222222233344" }; context.UserInfo.AddRange(zhangsan, lisi); context.SaveChanges(); var users = context.UserInfo.ToList(); foreach (var user in users) { Console.WriteLine($"{user.UserId} {user.UserName} {user.Age} {user.BankNum}"); } Console.WriteLine("Hello World!");
看界面输出
没啥变化,银行卡还是明文的,但是你看数据库存储的
总结:优点就在于,最小化影响我们使用,还能解决加密的问题,所以就目前看来,使用上没有任何影响。
加密方式也分多种,可以进行配置,各位自己研究吧,我就抛砖引玉了
留下您的脚步
最近评论