• EntityFrameworkCore数据加密存储解决方案


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

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

    看界面输出

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

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

    加密方式也分多种,可以进行配置

  • 相关阅读:
    洛谷P1352没有上司的舞会+树形二维DP
    高精度模板(从洛谷题解中骗来的
    Codeforces#398 &767C. Garland 树形求子节点的和
    LuoGu-P1122 最大子树和+树形dp入门
    HDU-3549Flow Problem 最大流模板题
    Codeforces Round #486 (Div. 3)988E. Divisibility by 25技巧暴力||更暴力的分类
    Codeforces Round #486 (Div. 3)988D. Points and Powers of Two
    数据结构&字符串:01字典树
    数据结构:可持久化平衡树
    数据结构:并查集-拆点
  • 原文地址:https://www.cnblogs.com/dongh/p/15464936.html
Copyright © 2020-2023  润新知