方案一:

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. Dart基础学习02--变量及内置类型

    Dart基础学习02--变量及内置类型 Dart中的变量 首先看一个变量的定义和赋值 var name = 'Bob'; 在Dart中变量名都是引用,这里的name就是一个指向值为Bob的字符串的引用 ...

  2. 使用synergyc共享键鼠

    通常情况下我们经常同时操作两台或者多台电脑, 这样就会存在多个键盘鼠标来回切换的问题. 那么我们主要的目标就是怎么在多个电脑上共享一套键盘鼠标,而且可以轻松的来回切换呢. 网上有很多的解决方案,这里我 ...

  3. 你不知道的Javascript(上卷)读书笔记之四 ---- 提升、this

    1. 提升 使用var声明的变量声明和函数的声明(函数表达式不会)会被提升至所在函数作用域顶部 a. 从编译器角度出发 回忆一下, 中关于编译器的内容,引擎会在解释 JavaScript 代码之前首先 ...

  4. tableView的使用(一)

    //tableView的创建    //1.初始化 initWithFrame:style:(plian,gronp)    //2.设置属性(行高, 分割线, 表头, 表尾)    //3.添加到父 ...

  5. 码云平台, Git提交需要输入用户名/密码, 怎么办

    这是因为, 检出代码的时候, 使用了http的方式: 那么, 改为ssh的地址就行了

  6. 深入理解Mysql索与事务隔离级别

    1. 概述 1.1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  7. shell脚本读取文件+读取命令行参数+读取标准输入+变量赋值+输出到文件

    读取url_list文件批量下载网页 url_list http://www.tianyancha.com/company/2412078287 http://www.4399.com/special ...

  8. python可变参数*args, **kwargs

    python可变参数*args, **kwargs def foo(* args, ** kwargs): print ' args = ',  args print ' kwargs = ',  k ...

  9. 【转载】在Jersey JAX-RS 处理泛型List等Collection

    在Java中,从1.5开始,我们就可以使用泛型了(generic),这看上去很像C++ Template,但是实际上它们是不同的.在这里我不想过多的描述细节,你可以从Google上搜索一下. 但是,泛 ...

  10. leetcode -day 15 Distinct Subsequences

    1.  Distinct Subsequences  Given a string S and a string T, count the number of distinct subsequen ...