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

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

看界面输出

image.png

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

image.png

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

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

CarsonIT 微信扫码关注公众号 策略、创意、技术

留下您的脚步

 

最近评论

查看更多>>

精选推荐

阅读排行

友情打赏

请打开您的微信,扫一扫