分享

EntityFrameworkCore数据加密存储解决方案

 包礼瞩 2022-10-29 发布于广东

我们平时项目中,有很多数据其实是需要加密存储的,但是我们基本上都只是将密码进行加密存储,如果我们的用户银行卡信息,身份证信息,这些要进行明文显示,但是如果数据泄露,也能保护用户数据的就更好了,今天给大家介绍的就是这样的一个解决方案。

1 、创建一个项目,添加引用

EntityFrameworkCore.DataEncryption Pomelo.EntityFrameworkCore.MySql

EntityFrameworkCore.DataEncryption 就是我们今天要介绍的主角。

2 、建表,我模拟一个用户表,表结构如下

CREATETABLE`userinfo`  (  `UserId`varchar ( 50 ) NOTNULL ,  `UserName`varchar ( 255 ) DEFAULTNULL ,  `Age`int ( 11 ) DEFAULTNULL ,  `BankNum`varchar ( 500 ) DEFAULTNULL , PRIMARYKEY ( `UserId` ) )  ENGINE=InnoDBDEFAULTCHARSET=utf8; 

其中 BankNum 是银行账号,注意,因为要存储加密字符串,所以字段长度要留长一点

3 、项目中创建一个 userinfo 的实体类

publicclassUserInfo { ///<summary> /// 用户 ID ///</summary> [ Key ] publicstringUserId { get;set; }
///<summary> /// 用户名 ///</summary> publicstringUserName { get;set; }
///<summary> /// 用户年龄 ///</summary> publicintAge { get;set; }
///<summary> /// 银行卡号 ///</summary> [ Encrypted ] publicstringBankNum { get;set; }
}

在 BankNum 上我们加了 EncryptedAttribute , 表示这个字段需要加密;

4 、创建 TestContext ,添加构造函数,并在 OnModelCreating 方法中配置我们加密的 provider 

usingSystem; usingSystem.Text; usingDataEncryptionDemo.Entitys; usingMicrosoft.EntityFrameworkCore; usingMicrosoft.EntityFrameworkCore.DataEncryption; usingMicrosoft.EntityFrameworkCore.DataEncryption.Providers; 
namespaceDataEncryptionDemo { publicclassTestContext : DbContext { privatereadonlybyte []_ encryptionKey=Encoding.Default.GetBytes ( '4A7D1ED414474E4033AC29CCB8653D9B' ) ; privatereadonlybyte []_ encryptionIV=Encoding.Default.GetBytes ( '0019DA6F1F30D07C51EBC5FCA1AC7DA6'.Substring ( 0 , 16 )) ; privatereadonlyIEncryptionProvider _ provider; publicTestContext ( ) { this ._ provider=newAesProvider ( this ._ encryptionKey , this ._ encryptionIV ) ; }
///<summary> /// 配置 ///</summary> protectedoverridevoidOnConfiguring ( DbContextOptionsBuilderoptionsBuilder ){ varconnectionString='server=127.0.0.1;port=3306;userid=root;password=123456;database=test;'; varserverVersion=newMySqlServerVersion ( newVersion ( 5 , 7 , 30 )) ; optionsBuilder.UseMySql ( connectionString , serverVersion ) ; }
///<summary> /// 用户表对象 ///</summary> publicDbSet<UserInfo>UserInfo { get;set; }
///<summary> /// 实体对象的配置 ///</summary> protectedoverridevoidOnModelCreating ( ModelBuildermodelBuilder ){ modelBuilder.UseEncryption ( this ._ provider ) ; } } }

到这里就开发完成了,是不是还挺简单

5 、试一下

TestContextcontext=newTestContext ( ) ; UserInfozhangsan=newUserInfo { UserId=Guid.NewGuid ( ).ToString ( ) , UserName=' 张三 ' , Age=15 , BankNum='123456789101112131415' } ; UserInfolisi=newUserInfo { UserId=Guid.NewGuid ( ).ToString ( ) , UserName=' 李四 ' , Age=20 , BankNum='987654312222222233344' } ; context.UserInfo.AddRange ( zhangsan , lisi ) ; context.SaveChanges ( ) ;
varusers=context.UserInfo.ToList ( ) ; foreach ( varuserinusers ){ Console.WriteLine ( $' { user.UserId }{ user.UserName }{ user.Age }{ user.BankNum } ' ) ; }Console.WriteLine ( 'HelloWorld!' ) ;

看界面输出

图片

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

图片

总结:优点就在于,最小化影响我们使用,还能解决加密的问题,所以就目前看来,使用上没有任何影响。

加密方式也分多种,可以进行配置,各位自己研究吧,我就抛砖引玉了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多