数据脱敏技术实战:Flink SQL 实现手机号 / 身份证号 / 银行卡号脱敏处理
数据脱敏是保护用户隐私的核心手段,尤其在处理手机号、身份证号、银行卡号等敏感信息时。以下通过 Flink SQL 实现三种常见脱敏场景,保留数据格式的同时隐藏关键信息。假设原始表结构:执行结果:→执行结果:→执行结果:→UDF 优势:支持正则校验、加密脱敏等复杂逻辑。长度校验:使用验证数据长度,避免截断错误动态掩码:使用适应变长数据(如 15/18 位身份证)敏感数据隔离:脱敏后数据写入新 Top
Flink SQL 实现数据脱敏技术实战
数据脱敏是保护用户隐私的核心手段,尤其在处理手机号、身份证号、银行卡号等敏感信息时。以下通过 Flink SQL 实现三种常见脱敏场景,保留数据格式的同时隐藏关键信息。
一、脱敏规则设计
| 数据类型 | 保留规则 | 脱敏格式示例 |
|---|---|---|
| 手机号 | 前3位 + 后4位 | 138****5678 |
| 身份证号 | 前6位 + 后4位 | 110105****1234 |
| 银行卡号 | 前6位 + 后4位 | 622202****1234 |
二、Flink SQL 脱敏实现
假设原始表 sensitive_data 结构:
CREATE TABLE sensitive_data (
user_id STRING,
phone STRING, -- 11位手机号
id_card STRING, -- 18位身份证号
bank_card STRING -- 16位银行卡号
) WITH (...);
1. 手机号脱敏
SELECT
user_id,
CONCAT(
SUBSTRING(phone, 1, 3), -- 取前3位
'****', -- 固定4位掩码
SUBSTRING(phone, 8, 4) -- 取第8位开始的4位(即后4位)
) AS masked_phone
FROM sensitive_data;
执行结果:13987654321 → 139****4321
2. 身份证号脱敏
SELECT
user_id,
CONCAT(
SUBSTRING(id_card, 1, 6), -- 取前6位
'****', -- 4位掩码
SUBSTRING(id_card, 15, 4) -- 取第15位开始的4位(即后4位)
) AS masked_id_card
FROM sensitive_data;
执行结果:110105199001011234 → 110105****1234
3. 银行卡号动态脱敏
SELECT
user_id,
CONCAT(
SUBSTRING(bank_card, 1, 6), -- 取前6位
REPEAT('*', CHAR_LENGTH(bank_card) - 10), -- 动态星号掩码
SUBSTRING(bank_card, CHAR_LENGTH(bank_card) - 3, 4) -- 取后4位
) AS masked_bank_card
FROM sensitive_data;
执行结果:6222021234567890 → 622202****7890
三、高级脱敏方案
1. 带校验的脱敏视图
CREATE VIEW masked_view AS
SELECT
user_id,
CASE
WHEN LENGTH(phone) = 11
THEN CONCAT(SUBSTRING(phone,1,3), '****', SUBSTRING(phone,8,4))
ELSE 'INVALID_PHONE' -- 长度异常处理
END AS masked_phone,
CASE
WHEN LENGTH(id_card) IN (15, 18)
THEN CONCAT(SUBSTRING(id_card,1,6), '****', RIGHT(id_card,4))
ELSE 'INVALID_ID'
END AS masked_id_card
FROM sensitive_data;
2. 可配置脱敏函数
CREATE FUNCTION mask_data AS 'com.udf.MaskUDF'
USING JAR '/path/to/udf.jar';
-- 调用自定义UDF
SELECT
mask_data(phone, 'PHONE') AS masked_phone,
mask_data(id_card, 'ID_CARD') AS masked_id_card
FROM sensitive_data;
UDF 优势:支持正则校验、加密脱敏等复杂逻辑。
四、生产环境注意事项
-
长度校验:
使用CHAR_LENGTH()验证数据长度,避免截断错误WHERE CHAR_LENGTH(bank_card) BETWEEN 16 AND 19 -
动态掩码:
使用REPEAT('*', n)适应变长数据(如 15/18 位身份证) -
敏感数据隔离:
脱敏后数据写入新 Topic,与原始数据物理隔离INSERT INTO masked_data_stream SELECT ... FROM sensitive_data -
性能优化:
对SUBSTRING和CONCAT启用代码生成优化SET table.exec.codegen=true;
关键点总结:
- 手机号:固定前3后4 + 4位掩码
- 身份证:固定前6后4 + 动态掩码
- 银行卡:固定前6后4 + 变长掩码
- 异常值:通过
CASE WHEN拦截非法数据
通过 Flink SQL 内置函数组合,无需额外依赖即可实现高效脱敏流水线。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)