C#实现手机号与邮箱等敏感信息脱敏显示

方予
方予
发布时间:2026-10-13 | 3人浏览过
原创

在前端展示或日志输出中,直接暴露用户手机号、邮箱等隐私信息存在安全风险。本文将详细解析如何使用 C# 编写通用的敏感信息隐藏(脱敏)方法,提供多种策略以适应不同的显示需求。

核心脱敏算法实现

为了灵活应对不同场景,这里设计了三个版本的通用方法:保留首尾指定字符数并动态生成掩码、保留首尾字符但使用固定数量的星号覆盖中间部分、以及基于比例的自动计算法。

第一类:中间掩码数量随长度变化

此方法适用于希望完全隐藏中间部分且占位符数量与原文长度一致的场景。主要参数为保留左侧字符数 left、右侧字符数 right,以及在总长度不足时是否优先显示左侧的开关 basedOnLeft。

/// <summary>
/// 隐藏敏感信息
/// </summary>
public static string HideSensitiveInfo(string info, int left, int right, bool basedOnLeft=true)
{
    if (string.IsNullOrEmpty(info))
    {
        return "";
    }
    
    StringBuilder sbText = new StringBuilder();
    int hiddenCharCount = info.Length - left - right;
    
    // 长度足够,中间全部替换
    if (hiddenCharCount > 0)
    {
        string prefix = info.Substring(0, left);
        string suffix = info.Substring(info.Length - right);
        sbText.Append(prefix);
        for (int i = 0; i < hiddenCharCount; i++)
        {
            sbText.Append("*");
        }
        sbText.Append(suffix);
    }
    else
    {
        // 长度不足的处理逻辑
        if (basedOnLeft)
        {
            if (info.Length > left && left > 0)
            {
                sbText.Append(info.Substring(0, left) + "****");
            }
            else
            {
                sbText.Append(info.Substring(0, 1) + "****");
            }
        }
        else
        {
            if (info.Length > right && right > 0)
            {
                sbText.Append("****" + info.Substring(info.Length - right));
            }
            else
            {
                sbText.Append("****" + info.Substring(info.Length - 1));
            }
        }
    }
    return sbText.ToString();
}

第二类:中间掩码数量固定

如果 UI 设计要求无论原文多长,中间遮挡部分始终显示相同长度的星号(例如4个),可采用此变体。其底层逻辑与第一类相似,但中间的循环生成被固定的字符串 "****" 取代。

/// <summary>
/// 隐藏敏感信息(固定中间长度)
/// </summary>
public static string HideSensitiveInfo1(string info, int left, int right, bool basedOnLeft = true)
{
    if (string.IsNullOrEmpty(info))
    {
        return "";
    }
    
    StringBuilder sbText = new StringBuilder();
    int hiddenCharCount = info.Length - left - right;
    
    if (hiddenCharCount > 0)
    {
        string prefix = info.Substring(0, left);
        string suffix = info.Substring(info.Length - right);
        sbText.Append(prefix);
        sbText.Append("****"); // 固定掩码
        sbText.Append(suffix);
    }
    else
    {
        // 长度不足的处理(逻辑同上)
        if (basedOnLeft)
        {
            if (info.Length > left && left > 0)
            {
                sbText.Append(info.Substring(0, left) + "****");
            }
            else
            {
                sbText.Append(info.Substring(0, 1) + "****");
            }
        }
        else
        {
            if (info.Length > right && right > 0)
            {
                sbText.Append("****" + info.Substring(info.Length - right));
            }
            else
            {
                sbText.Append("****" + info.Substring(info.Length - 1));
            }
        }
    }
    return sbText.ToString();
}

第三类:按比例自动截取

无需硬编码左右位数,只需传入总长度的分割比例 sublen(默认为3,即取前1/3和后1/3)。该方法同样包含对长度异常的降级处理。

/// <summary>
/// 按比例隐藏敏感信息
/// </summary>
/// <param name="sublen">比例因子,如3表示取1/3

针对特定场景的封装应用

在实际业务中,通常只需要针对手机号码或电子邮件地址调用上述核心方法即可。以下是两个常用的封装示例。

手机号脱敏

常见的手机显示规则是保留前三位和后四位(例如 138****5678)。可以直接复用第一种和第二种通用方法进行演示:

/// <summary>
/// 隐藏手机号详情
/// </summary>
public static string HideTelDetails(string phone, int left = 3, int right = 4)
{
    // 示例调用第一个通用方法
    return HideSensitiveInfo(phone, left, right);
}

调用效果验证如下:

如果使用固定掩码长度的方法 HideSensitiveInfo1,实现类似的效果:

/// <summary>
/// 隐藏手机号详情(固定掩码)
/// </summary>
public static string HideTelDetailsFixed(string phone, int left = 3, int right = 4)
{
    return HideSensitiveInfo1(phone, left, right);
}

调用效果验证如下:

电子邮箱脱敏

邮箱地址通常需要保护用户名部分,而保留域名(@之后的内容)。利用正则表达式识别是否为有效邮箱后,通过定位 @ 符号来确定右半部分的长度,然后调用通用方法:

/// <summary>
/// 隐藏邮箱地址详情
/// </summary>
public static string HideEmailDetails(string email, int left = 3)
{
    if (string.IsNullOrEmpty(email))
    {
        return "";
    }
    
    // 验证邮件格式
    if (System.Text.RegularExpressions.Regex.IsMatch(
        email, @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"))
    {
        // 计算域名部分(@及其之后)的长度
        int suffixLen = email.Length - email.LastIndexOf('@');
        // 调用通用方法,设置 basedOnLeft=false 以优先展示尾部域名
        return HideSensitiveInfo(email, left, suffixLen, false);
    }
    else
    {
        // 非邮箱格式则作为普通文本处理
        return HideSensitiveInfo(email, left, 0);
    }
}

该方法的执行结果验证:

以上就是C#实现手机号、邮箱等敏感信息隐藏显示的详细内容,更多关于C#数据脱敏与安全处理的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表