Skip to main content

30. 脱敏处理

📝 模块更新日志
  • 新特性
    •   脱敏模块 [SensitiveDetection] 特性默认错误信息 4.9.8.13 ⏱️2026.02.06 d8adca7
    •   脱敏模块 [SensitiveDetection] 特性支持配置 ShowSensitiveWords 属性用来显示命中敏感词 4.9.8.10 ⏱️2026.01.29 e6d31df
    •   脱敏模块同步方法 4.9.8.10 ⏱️2026.01.29 e6d31df
    •   脱敏词汇模块支持自定义嵌入文件词汇文件名 4.9.1.45 ⏱️2024.03.09 4ed72fc
    •   脱敏词汇模块支持获取敏感词和所在位置 4.9.1.45 ⏱️2024.03.09 #I972P7
  • 突破性变化
    •   脱敏模块 VaildedAsync 方法名为 IsValidAsync 4.9.8.9 ⏱️2026.01.28 5d43946
  • 问题修复
    •   脱敏模块 [SensitiveDetection] 特性不支持格式化符:{0} 4.9.8.10 ⏱️2026.01.29 e6d31df
    •   脱敏模块跨平台换行符差异导致词汇分割失败的问题 4.9.8.9 ⏱️2026.01.28 5d43946
    •   脱敏模块因程序集名自定义导致无法加载词汇资源的问题 4.9.7.119 ⏱️2025.09.07 #IC6SBK
    •   脱敏词汇模块获取所有词汇没有去重问题 4.9.1.45 ⏱️2024.03.09 4ed72fc
    •   脱敏处理如果字典存在重复词导致异常问题 4.8.8.4 ⏱️2023.04.23 #I6Y19K
  • 其他更改
    •   脱敏模块加载词汇和查找词汇性能 4.9.8.10 ⏱️2026.01.29 e6d31df
    •   脱敏处理 sensitive-words.txt 嵌入文件支持 UTF8 BOM 编码,感谢 @man119 4.8.6.7 ⏱️2023.02.18 #I6G1JN
版本说明

以下内容仅限 Furion 2.4.4 + 版本使用。

30.1 关于脱敏

引用百度百科:

数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。数据安全技术之一,数据库安全技术主要包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。

Furion 系统中,脱敏处理 指的是对不符合系统合法词汇检测验证。

30.2 如何使用

Furion 框架内置了一套默认的脱敏词汇脱敏处理机制,并且提供自定义操作。

30.2.1 注册 脱敏词汇检测 服务

public void ConfigureServices(IServiceCollection services)
{
services.AddSensitiveDetection();
}

30.2.2 创建 sensitive-words.txt 文件

Web 启动层项目中创建 sensitive-words.txt 文件,确保采用 UTF-8 编码格式(Furion 4.8.6.7+ 支持 UTF8 BOM 编码格式) 且设置为嵌入式资源!

sensitive-words.txt 内容格式为每一行标识一个脱敏词汇:

坏人
无语
滚开
八嘎
Furion 3.8.9+ 版本

Furion 3.8.9+ 版本支持 | 分隔符进行分割,也同时支持 换行| 混用,如:

坏人|无语|滚开
八嘎

推荐使用 | 方式,可以节省词库占用存储空间。

接下来设置为嵌入式资源:

30.2.3 使用脱敏检测

  • 实现数据验证脱敏检测 [SensitiveDetection]

Furion 框架提供了 [SensitiveDetection] 验证特性,可以对参数、属性进行脱敏验证,用法和 [DataValidation] 一致,如:

// 在属性中使用
public class Content
{
[SensitiveDetection] // 支持 ErrorMessage 配置错误信息,
// [SensitiveDetection(ErrorMessage = "包含敏感词")] // 支持 ErrorMessage 配置错误信息
// [SensitiveDetection(ErrorMessage = "{0} 包含敏感词,包含敏感词:{1}", ShowSensitiveWords = true)] // 支持显示命中的敏感词,Furion 4.9.8.10+ 支持
public string Text { get; set; }
}

// 在 动态API/Controller 中使用
public void Test([SensitiveDetection] string text)
{

}
  • 通过 ISensitiveDetectionProvider 服务使用

Furion 框架也提供了 ISensitiveDetectionProvider 服务进行手动脱敏验证处理,如:

public class YourSensitiveService : IDynamicApiController
{
private readonly ISensitiveDetectionProvider _sensitiveDetectionProvider;

public TestSensitiveDetection(ISensitiveDetectionProvider sensitiveDetectionProvider)
{
_sensitiveDetectionProvider = sensitiveDetectionProvider;
}

/// <summary>
/// 获取所有脱敏词汇
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<string>> GetWordsAsync()
{
return await _sensitiveDetectionProvider.GetWordsAsync(); // Furion 4.9.8.10+ 支持同步方法
}

/// <summary>
/// 判断是否是正常的词汇
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public async Task<bool> IsValidAsync(string text)
{
return await _sensitiveDetectionProvider.IsValidAsync(text); // Furion 4.9.8.9 之前使用 VaildedAsync,Furion 4.9.8.10+ 支持同步方法
}

/// <summary>
/// 替换非正常词汇
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public async Task<string> ReplaceAsync(string text)
{
return await _sensitiveDetectionProvider.ReplaceAsync(text, '*'); // Furion 4.9.8.10+ 支持同步方法
}

/// <summary>
/// 返回敏感的词汇和位置,Furion 4.9.1.45+` 版本支持
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public async Task<Dictionary<string, List<int>>> FoundSensitiveWordsAsync(string text)
{
return await _sensitiveDetectionProvider.FoundSensitiveWordsAsync(text); // Furion 4.9.8.10+ 支持同步方法
}
}

30.2.4 脱敏词汇替换

Furion 框架也提供了替换脱敏词汇的特性支持,如:

// 在属性中使用
public class Content
{
[SensitiveDetection('*')]
public string Text { get; set; }
}
特别注意

Furion 3.8.8+ 版本后支持方法特性直接替换

public void Test([SensitiveDetection('*')] string text)
{
}

30.3 自定义 sensitive-words.txt 文件名

版本说明

以下内容仅限 Furion 4.9.1.45 + 版本使用。

services.AddSensitiveDetection(options =>
{
options.EmbedFileName = "custom-words.txt";
});

30.4 自定义脱敏词汇处理

Furion 框架除了内置了一套默认的 脱敏处理 程序,也支持自定义脱敏处理程序。

  1. 自定义 ISensitiveDetectionProvider 实现
/// <summary>
/// 自定义脱敏词汇检测器
/// </summary>
public class YourSensitiveDetectionProvider : ISensitiveDetectionProvider
{
/// <summary>
/// 脱敏词汇数据文件名
/// </summary>
private readonly string _embedFileName;

/// <summary>
/// 构造函数
/// </summary>
/// <param name="embedFileName"></param>
public YourSensitiveDetectionProvider(string embedFileName) // Furion 4.9.1.45+` 版本支持
{
_embedFileName = embedFileName;
}

/// <summary>
/// 返回所有脱敏词汇
/// </summary>
/// <returns></returns>
public async Task<IEnumerable<string>> GetWordsAsync()
{
// 这里写你脱敏词汇数据的来源(如从数据库读取),建议做好缓存操作
}

/// <summary>
/// 判断脱敏词汇是否有效
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public async Task<bool> IsValidAsync(string text) // Furion 4.9.8.9 之前使用 VaildedAsync
{
// 这里写你如何判断是正常的字符,返回 true 正常,返回 false 表示是个脱敏词汇
}

/// <summary>
/// 替换脱敏词汇
/// </summary>
/// <param name="text"></param>
/// <param name="transfer"></param>
/// <returns></returns>
public async Task<string> ReplaceAsync(string text, char transfer = '*')
{
// 这里写你替换非正常字符为指定字符
}

/// <summary>
/// 查找脱敏词汇,Furion 4.9.1.45+` 版本支持
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public Task<Dictionary<string, List<int>>> FoundSensitiveWordsAsync(string text)
{
// 这里写你查找词汇的逻辑
}
}
  1. 注册自定义脱敏提供器
public void ConfigureServices(IServiceCollection services)
{
services.AddSensitiveDetection<YourSensitiveDetectionProvider>();
}

之后系统将自动采用自定义的方式进行脱敏处理。

30.5 反馈与建议

与我们交流

给 Furion 提 Issue