
C/C实现敏感信息掩码一、功能概述本方案提供了一套完整的敏感信息掩码工具库能够自动检测并掩码日志中的身份证号码、手机号码和邮箱地址防止敏感信息泄露。二、核心功能身份证号码掩码• 掩码规则保留前6位后4位中间用 ******** 替代• 示例512324XXXXXXXX3870 → 512324********3870手机号码掩码• 掩码规则保留前3位后4位中间用 **** 替代• 示例13800138000 → 138****5678邮箱地址掩码• 掩码规则保留用户名前2位符号及域名• 示例zhangsanexample.com → zh***example.com三、API 接口说明函数名 功能描述 返回值 参数说明mask_id_card_in_string 掩码身份证号码 0:无, 1:有 输入字符串、输出缓冲区、缓冲区大小mask_phone_number_in_string 掩码手机号码 0:无, 1:有 输入字符串、输出缓冲区、缓冲区大小mask_email_in_string 掩码邮箱地址 0:无, 1:有 输入字符串、输出缓冲区、缓冲区大小mask_all_in_string 掩码所有敏感信息 0:无, 1:有 输入字符串、输出缓冲区、缓冲区大小mask_id_card_in_log_string 直接处理日志字符串 无 日志字符串、缓冲区大小mask_phone_number_in_log_string 直接处理手机号 无 日志字符串mask_email_in_log_string 直接处理邮箱 无 日志字符串四、使用示例方式一使用宏 MaskedTrace推荐C#includepub.h// 自动检测并掩码所有敏感信息MaskedTrace(“用户信息姓名张三身份证号%s手机号%s邮箱%s”,“512324XXXXXXXX3870”, “13800138000”, “zhangsanexample.com”);// 输出用户信息姓名张三身份证号5123243870手机号138*5678邮箱zhexample.com方式二单独处理身份证号码C#includepub.hchar input[] “用户身份证号为512324XXXXXXXX3870”;char output[1024];if (mask_id_card_in_string(input, output, sizeof(output))){printf(“掩码后%s\n”, output);// 输出掩码后用户身份证号为5123243870}方式三直接处理字符串C#includepub.hchar log_msg[] “用户李四身份证号512324XXXXXXXX3870已注册”;printf(“处理前%s\n”, log_msg);mask_id_card_in_log_string(log_msg, sizeof(log_msg));printf(“处理后%s\n”, log_msg);// 输出处理后用户李四身份证号512324********3870已注册五、编译方法Bash编译命令参考 1.shcc -o test test_id_card_logger.c-L/替换为用户目录/lib -lbase -lc -I/替换为用户目录/include运行测试./test六、测试用例测试编号 测试场景 输入 预期输出1 单个身份证号码 512324XXXXXXXX3870 51232438702 多个身份证号码 512324XXXXXXXX3870522730197908279366 5123243870522730********93663 单个手机号码 13800138000 13856784 多个手机号码 1380013800013800138000 1385678138*00005 邮箱地址 zhangsanexample.com zhexample.com6 综合敏感信息 多种信息混合 全部掩码处理七、集成建议全局日志宏替换在项目中统一替换原有的 Trace 宏为 MaskedTraceC// 原有代码Trace(“用户登录用户名%s密码%s”, username, password);// 替换为MaskedTrace(“用户登录用户名%s密码%s”, username, password);日志打印函数封装在日志打印函数中集成掩码功能Cvoid my_log(constchar* fmt, …) {char buffer[1024];va_list args;va_start(args, fmt);vsnprintf(buffer, sizeof(buffer), fmt, args);va_end(args);// 自动掩码敏感信息char masked[1024];if (mask_all_in_string(buffer, masked, sizeof(masked))) {Trace(“%s”, masked);} else {Trace(“%s”, buffer);}}3. 文件日志记录在文件日志记录时自动掩码Cvoid write_log_to_file(constchar* filepath, constchar* content) {char masked_content[4096];if (mask_all_in_string(content, masked_content, sizeof(masked_content))) {// 写入掩码后的内容fwrite(masked_content, 1, strlen(masked_content), fp);} else {fwrite(content, 1, strlen(content), fp);}}八、注意事项缓冲区大小确保输出缓冲区足够大建议至少 4096 字节正则表达式身份证号码使用 GB/T 11643-1999 标准性能影响掩码处理会增加少量 CPU 开销建议在非高频路径使用兼容性支持 Linux 和 Windows 平台安全函数(Linux/Unix)使用 __snprintf_chk、__strncat_chk 等安全函数九、扩展建议支持更多敏感信息如银行卡号、护照号等自定义掩码规则通过配置文件定义掩码规则性能优化使用更高效的字符串匹配算法日志级别控制根据日志级别决定是否进行掩码处理总结本方案提供了一套简单易用的敏感信息掩码工具通过统一的接口和自动化的处理方式有效防止敏感信息泄露建议在全项目范围内推广使用。