在C#开发中,我们经常需要从数据库读取用户数据,但手机号、身份证等敏感字段不能直接暴露给前端或日志。通过程序层的数据掩码和动态隐藏策略,可以在不改变数据库结构的情况下保护隐私。

什么是数据掩码
数据掩码是指对敏感数据部分字符进行替换或变形,使原始信息不可直接识别,但格式保持不变。例如将手机号 13812345678 处理为 138****5678。
基础字符串掩码实现
最简单的方式是使用 C# 的字符串截取与补星号:
using System;
public static class MaskHelper
{
// 对字符串中间部分打码,保留前后各 keep 位
public static string Mask(string input, int keep)
{
if (string.IsNullOrEmpty(input)) return input;
if (input.Length <= keep * 2) return new string('*', input.Length);
int maskLen = input.Length - keep * 2;
return input.Substring(0, keep)
+ new string('*', maskLen)
+ input.Substring(input.Length - keep);
}
public static void Main()
{
string phone = "13812345678";
Console.WriteLine(Mask(phone, 3)); // 138****5678
}
}
在实体类中动态隐藏
实际项目中,我们常根据当前用户权限动态决定是否返回明文。可以通过属性封装实现:
public class UserDto
{
private string _phone;
public string Phone
{
get => _showSensitive ? _phone : MaskHelper.Mask(_phone, 3);
set => _phone = value;
}
private bool _showSensitive;
public void SetSensitiveVisible(bool visible) => _showSensitive = visible;
}
结合数据库查询层
使用 Dapper 等轻量 ORM 时,可在映射后统一处理:
using System.Collections.Generic;
using System.Data.SqlClient;
using Dapper;
public class UserRepository
{
public IEnumerable<UserDto> QueryUsers(bool isAdmin)
{
using var conn = new SqlConnection("Server=127.0.0.1;Database=test;Uid=sa;Pwd=123;");
var list = conn.Query<UserDto>("SELECT Phone FROM Users");
foreach (var u in list)
{
u.SetSensitiveVisible(isAdmin);
}
return list;
}
}
小结
通过 C# 的字符串处理配合实体类封装,我们可以灵活地实现数据库敏感字段的掩码与动态隐藏。对于更高安全要求的场景,也可以将掩码逻辑下沉到数据库视图或存储过程中。