方案一:

DTO中处理:

        private string idNumber;
/// <summary>
/// 身份证号码
/// </summary>
[Column("id_number")]
public string IdNumber
{
get { return idNumber; }
set { idNumber = SensitiveHelper.GetIdNumber(value); }
}

方案二:

业务层处理:

核心方法如下:

        /// <summary>
/// 根据输入参数T中的特性,对属性进行敏感数据处理
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static List<T> GetSensitiveResult<T>(List<T> source)
{
if (!SysConfigHelper.Instance.GetBool("Para"))
{
return source;
} List<PropertyInfo> props = GetPropertyInfos<SensitiveAttribute>(typeof(T)); if (props.Count() > )
{
source.ForEach(r =>
{
foreach (var prop in props)
{
var p = prop.GetCustomAttributes(true).OfType<SensitiveAttribute>().FirstOrDefault();
var accesor = new PropertyAccessor(typeof(T), prop.Name);
var value = accesor.Get(r)?.ToString(); switch (p.SensitiveType)
{
case SensitiveType.IdNumber:
accesor.Set(r, GetSensitiveIdNumber(value));
break;
case SensitiveType.Name:
accesor.Set(r, GetSensitiveName(value));
break;
default:
break;
}
} });
}
return source;
} /// <summary>
/// 姓名敏感处理
/// </summary>
/// <param name="fullName"></param>
/// <returns></returns>
public static string GetSensitiveName(string fullName)
{if (string.IsNullOrEmpty(fullName))
{
return "";
} string familyName = fullName.Substring(, ); return familyName.PadRight(fullName.Length - , '*');
} /// <summary>
/// 证件号码敏感处理
/// </summary>
/// <param name="idNumber"></param>
/// <returns></returns>
public static string GetSensitiveIdNumber(string idNumber)
{if (string.IsNullOrEmpty(idNumber))
{
return "";
} string number = idNumber.Substring(, ); return number.PadRight(idNumber.Length - , '*');
}

在第一个方法中的类型T中,需要对要敏感处理的属性增加特性Attribute

public class SensitiveAttribute: Attribute
{
#region Fields
public SensitiveType SensitiveType { get; set; }
#endregion #region Constructors and Destructors public SensitiveAttribute()
{ } public SensitiveAttribute(SensitiveType type)
{
this.SensitiveType = type;
}
#endregion #region Public Methods and Operators #endregion
} public enum SensitiveType
{
Name,
IdNumber
}

在DTO中使用:

        [Sensitive(SensitiveType.Name)]
public string BillPatientName { get; set; }

两个方案各有利弊:

方案一:

优点:性能最好,不需要再循环对数据进行处理。

缺点:不推荐在DTO中的get,set方法中写逻辑。

方案二:

优点:方法简单,各司其职

缺点:性能不高。

最终我们选择的方案一,希望有高手指点。

.net 数据脱敏代码实现的更多相关文章

  1. java 数据脱敏

    所谓数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份 ...

  2. 如何用java实现数据脱敏

    数据脱敏是什么意思呢? 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护.在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并 ...

  3. Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)

    大家好!我是小富- 这几天公司在排查内部数据账号泄漏,原因是发现某些实习生小可爱居然连带着账号.密码将源码私传到GitHub上,导致核心数据外漏,孩子还是没挨过社会毒打,这种事的后果可大可小. 说起这 ...

  4. 利用Jackson序列化实现数据脱敏

    几天前使用了Jackson对数据的自定义序列化.突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录. 核心思想是利用Jackson的StdSerializer,@JsonSerialize, ...

  5. 数据脱敏 t-closeness介绍与实现

    数据脱敏 t-closeness介绍与实现 本文主要基于t-closeness的首次提出团队Ninghui Li, Tiancheng Li, Suresh Venkatasubramanian发表的 ...

  6. ShardingJdbc-分表;分库;分库分表;读写分离;一主多从+分表;一主多从+分库分表;公共表;数据脱敏;分布式事务

    目录 创建项目 分表 导包 表结构 Yml 分库 Yml Java 分库分表 数据库 Yml 读写分离 数据库 Yml 其他 只请求主库 读写分离判断逻辑代码 一主多从+分表 Yml 一主多从+分库分 ...

  7. 【转】 BSS段 数据段 代码段 堆栈 指针 vs 引用

    原文:http://blog.csdn.net/godspirits/article/details/2953721 BSS段 数据段 代码段 堆栈 (转+) 声明:大部分来自于维基百科,自由的百科全 ...

  8. Android清除本地数据缓存代码案例

    Android清除本地数据缓存代码案例 直接上代码: /*  * 文 件 名:  DataCleanManager.java  * 描    述:  主要功能有清除内/外缓存,清除数据库,清除shar ...

  9. 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试

    JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...

随机推荐

  1. 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP

    [BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...

  2. FastReports_4.14.1 _Cliff手动安装

    首次编译frx15.dproj包的时候,会出错: [DCC Fatal Error] fs15.dpk(59): F1026 File not found: 'fs_ipascal.dcu'原因是因为 ...

  3. 我的Android进阶之旅------>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

    Android 设备的CPU类型通常称为ABIs 问题描述 解决方法 1解决之前的截图 2解决后的截图 3解决方法 4建议 为什么你需要重点关注so文件 App中可能出错的地方 其他地方也可能出错 使 ...

  4. ps 和 grep 查找消除 grep自身查找(转载)

    用ps -def | grep查找进程很方便,最后一行总是会grep自己. $ ps -def | grep dragonfly-framework dean 5273 5272 0 15:23 pt ...

  5. java 多线程 day04 线程通信

    package com.czbk.thread; /** * Created by chengtao on 17/12/3. * 需求: 子线程先运行10次,然后主线程运行 100次,依次运行50次 ...

  6. Redis二(Hash操作)

    Hash操作 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value) 1 2 3 4 5 6 7 8 9 # name对应的hash中设置一个键值对 ...

  7. pyplot基本绘制

    pyplot实现的功能与Matlab中的绘制方式很相似. 先看一个绘制折线的例子: import matplotlib.pyplot as plt plt.plot([1, 17, 8, 9]) pl ...

  8. Python中 and,or 的计算规则

    一.纯 and 和 or 语句 1. 在纯and语句中,如果每一个表达式都不是假的话,那么返回最后一个,因为需要一直匹配直到最后一个.如果有一个是假,那么返回假2. 在纯or语句中,只要有一个表达式不 ...

  9. django-admin自定义登录

    这个效果,单位代码是User model 的一个外键Company 通过修改form,然后在前端显示 修改form class AuthenticationForm(forms.Form): &quo ...

  10. Django_内置Admin

    Django内置Admin   Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.co ...