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!");看界面输出

没啥变化,银行卡还是明文的,但是你看数据库存储的

总结:优点就在于,最小化影响我们使用,还能解决加密的问题,所以就目前看来,使用上没有任何影响。
加密方式也分多种,可以进行配置,各位自己研究吧,我就抛砖引玉了
川公网安备 51010702003150号
留下您的脚步
最近评论