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

    看界面输出

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

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

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

  • 相关阅读:
    HDOJ 2095 find your present (2)
    HDOJ 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
    九度 1337 寻找最长合法括号序列
    九度 1357 疯狂地Jobdu序列
    HDOJ 1280 前m大的数
    九度 1343 城际公路网
    九度 1347 孤岛连通工程
    HDOJ 2151 Worm
    九度 1342 寻找最长合法括号序列II
    九度 1346 会员积分排序
  • 原文地址:https://www.cnblogs.com/dongh/p/15464936.html
Copyright © 2020-2023  润新知