zoukankan      html  css  js  c++  java
  • 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!" ) ;

    看界面输出

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

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

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

  • 相关阅读:
    SCILAB简介[z]
    UG OPEN API编程基础 2约定及编程初步
    Office 2003与Office 2010不能共存的解决方案
    UG OPEN API 编程基础 3用户界面接口
    NewtonRaphson method
    UG OPEN API编程基础 13MenuScript应用
    UG OPEN API编程基础 14API、UIStyler及MenuScript联合开发
    UG OPEN API编程基础 4部件文件的相关操作
    UG OPEN API编程基础 1概述
    16 UG Open的MFC应用
  • 原文地址:https://www.cnblogs.com/dongh/p/15464936.html
Copyright © 2011-2022 走看看