方案一:

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. mybatis的oracle的in超过1000的写法

    <if test="preIds != null and preIds.size() > 0"> AND PRE_ID IN <trim suffixOve ...

  2. 第08章—整合Spring Data JPA

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  3. Centos 软链接命令(十)

    链接命令:ln  (link) ln -s [源文件] [目标文件] 功能描述:生成链接文件 选项: -s 创建软链接 硬链接特征: 1,拥有相同的i节点和存储block块,可以看作是同一个文件: 2 ...

  4. 2015-03-10——简析javascript对象

    对于构造函数,它是Function对象的一个实例,可以定义自己的静态成员先实例化出对象,后执行function中内部代码 静态成员:  var abc = function () {};  //既是一 ...

  5. 最全的Eclipse使用快捷键

    Eclipse 是一种基于 Java 的可扩展开源开发平台.尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言,Eclipse 还包括插件开发环境等,下面将为大家介 ...

  6. 某游戏应用的redis 数据库结构设计(转)

    add by zhj: 搜了一下作者,原来之前是网易的大牛.2011年的文章,有些老了,很多地方可以将string类型键转为hash类型,这样更节省内存,将key聚合在一起,也更简练. 原文:http ...

  7. 斯坦福大学Andrew Ng - 机器学习笔记(8) -- 推荐系统 & 大规模机器学习 & 图片文字识别

    大概用了一个月,Andrew Ng老师的机器学习视频断断续续看完了,以下是个人学习笔记,入门级别,权当总结.笔记难免有遗漏和误解,欢迎讨论. 鸣谢:中国海洋大学黄海广博士提供课程视频和个人笔记,在此深 ...

  8. ansible判定文件或者文件夹是否存在

    ansible 的常用模块中没有判定当文件存在或者不存在时,执行某个执行 使用下面方法能简单判定某个文件是否存在 --- - name: judge a file or dir is exits sh ...

  9. 简明python教程二-----对象

    物理行:是你在编写程序时所看见的. 逻辑行:是Python看见的单个语句. 默认的,python希望每行都只使用一个语句,这样使得代码更加易读. 如果你想要在一个物理行中使用多于一个逻辑行,用分号“: ...

  10. LeetCode:前K个高频元素【347】

    LeetCode:前K个高频元素[347] 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [ ...