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;

执行结果
13987654321139****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;

执行结果
110105199001011234110105****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;

执行结果
6222021234567890622202****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 优势:支持正则校验、加密脱敏等复杂逻辑。


四、生产环境注意事项
  1. 长度校验
    使用 CHAR_LENGTH() 验证数据长度,避免截断错误

    WHERE CHAR_LENGTH(bank_card) BETWEEN 16 AND 19
    

  2. 动态掩码
    使用 REPEAT('*', n) 适应变长数据(如 15/18 位身份证)

  3. 敏感数据隔离
    脱敏后数据写入新 Topic,与原始数据物理隔离

    INSERT INTO masked_data_stream SELECT ... FROM sensitive_data
    

  4. 性能优化
    SUBSTRINGCONCAT 启用代码生成优化

    SET table.exec.codegen=true; 
    


关键点总结

  • 手机号:固定前3后4 + 4位掩码
  • 身份证:固定前6后4 + 动态掩码
  • 银行卡:固定前6后4 + 变长掩码
  • 异常值:通过 CASE WHEN 拦截非法数据
    通过 Flink SQL 内置函数组合,无需额外依赖即可实现高效脱敏流水线。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐