数据脱敏不是打码那么简单:聊聊敏感数据脱敏与可逆脱敏,到底该怎么选?

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 数据脱敏不是打码那么简单:聊聊敏感数据脱敏与可逆脱敏,到底该怎么选?

数据脱敏不是打码那么简单:聊聊敏感数据脱敏与可逆脱敏,到底该怎么选?

作者:Echo_Wish


前几天有个做数据平台的朋友跟我吐槽:

“生产库权限收得很严,测试环境也禁止访问真实数据,结果开发天天抱怨数据不真实,BUG复现不了。”

这其实是很多企业都会遇到的问题。

一边是数据安全。

另一边是业务效率。

尤其是在大数据平台、数据中台、数据仓库、AI训练平台越来越普及的今天,数据流转的范围越来越大。

开发要数据。

测试要数据。

算法训练要数据。

BI分析要数据。

供应商联调还要数据。

如果全部使用真实数据,风险巨大。

如果全部打码处理,又可能失去业务价值。

于是就出现了两个经常被拿出来讨论的方案:

  • 脱敏(Irreversible Masking)
  • 可逆脱敏(Reversible Masking)

很多人以为这俩只是技术实现不同。

其实背后反映的是企业对于数据价值与数据安全的权衡。

今天咱们就聊透这个话题。


一、先搞明白:什么叫脱敏?

最简单的理解:

把敏感信息变成看不懂的信息。

例如用户手机号:

13812345678

变成:

138****5678

或者:

***********

或者:

HASH值

这样即使数据泄露,也无法直接看到真实信息。

常见敏感字段包括:

类型 示例
手机号 13812345678
身份证 320**
银行卡 6222**8888
姓名 张*
邮箱 abc*@qq.com
地址 北京市**

二、什么叫可逆脱敏?

可逆脱敏本质上是:

数据被隐藏了,但在授权条件下可以恢复。

比如:

13812345678

经过加密后变成:

U2FsdGVkX19rX8...

普通人看不懂。

但是拥有密钥的人:

decrypt()

即可恢复:

13812345678

这就是可逆脱敏。


三、很多企业其实在假脱敏

我见过不少项目这样写:

def mask_phone(phone):
    return phone[:3] + "****" + phone[-4:]

输出:

138****5678

开发觉得安全了。

实际上呢?

一点都不安全。

为什么?

因为:

前三位 + 后四位

已经暴露了7位信息。

手机号总共11位。

只剩4位未知。

组合数:

10000

暴力枚举几秒钟就搞定。

所以很多所谓脱敏:

其实只是界面展示脱敏。

并不是数据安全脱敏。

这是两个概念。


四、真正不可逆脱敏:Hash方案

如果业务根本不需要恢复数据。

推荐直接Hash。

例如:

import hashlib

def hash_phone(phone):
    return hashlib.sha256(phone.encode()).hexdigest()

phone = "13812345678"

print(hash_phone(phone))

输出:

a1f9fbd6......

特点:

优点

  • 无法恢复
  • 安全等级高
  • 适合数据分析

缺点

  • 不能找回原值
  • 客服无法查询用户

例如:

用户投诉订单

客服看到:

a1f9fbd6...

完全不知道是谁。


五、可逆脱敏的核心:加密

很多业务其实必须找回原值。

例如:

电商客服

查看订单
联系用户

银行风控

风险核查

医疗系统

患者追踪

这种场景只能采用可逆脱敏。

下面用AES演示。

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64

key = b"1234567890123456"

def encrypt(text):
    cipher = AES.new(key, AES.MODE_ECB)

    encrypted = cipher.encrypt(
        pad(text.encode(), AES.block_size)
    )

    return base64.b64encode(encrypted).decode()


def decrypt(cipher_text):
    cipher = AES.new(key, AES.MODE_ECB)

    decrypted = unpad(
        cipher.decrypt(
            base64.b64decode(cipher_text)
        ),
        AES.block_size
    )

    return decrypted.decode()


phone = "13812345678"

cipher_text = encrypt(phone)

print(cipher_text)

print(decrypt(cipher_text))

输出:

3M4fT9....
13812345678

这就是典型可逆脱敏。


六、真正先进的方案:Tokenization

近几年金融行业特别喜欢这种方式。

思路很简单:

建立映射表。

原始数据:

13812345678

映射为:

TK_9847321

数据库存:

TK_9847321

真实手机号存入安全库。

例如:

token_map = {
   
    "TK_001": "13812345678"
}

业务系统看到:

TK_001

安全中心看到:

13812345678

这种方式有几个好处:

  • 不暴露原数据
  • 可恢复
  • 不依赖加密算法

很多支付系统都在这么干。


七、大数据平台到底该选哪种?

这是很多架构师最纠结的问题。

我的经验是:

不要想着一种方案打天下。

应该分层处理。

第一层:展示脱敏

给运营看:

138****5678

降低误操作风险。


第二层:分析脱敏

给数据仓库:

SHA256(phone)

保证统计能力。

例如:

COUNT(DISTINCT HASH_PHONE)

完全没问题。


第三层:业务脱敏

给客服系统:

Token

需要权限才能解密。


第四层:核心脱敏

给AI训练平台:

完全匿名化

姓名:

张三

变:

用户A

地址:

北京市朝阳区

变:

华北地区

最大程度避免隐私泄露。


八、为什么未来可逆脱敏会越来越危险?

很多企业有个误区:

加密了就安全。

其实不是。

问题出在:

密钥管理

如果密钥泄露:

加密 = 裸奔

过去几年大量数据泄漏事件都不是算法被破解。

而是:

密钥放Git
密钥写配置文件
密钥写代码

导致直接解密。

所以未来趋势其实不是:

更强加密

而是:

更少可逆

能不可逆就不可逆。

能匿名化就匿名化。

只有业务必须恢复时才允许可逆。

这是数据治理成熟度的重要体现。


九、我的一点思考

这些年做大数据平台、数据治理和数据安全项目,我越来越认同一个观点:

最安全的数据,不是加密的数据,而是不存在的数据。

很多企业喜欢囤数据。

觉得以后可能有用。

手机号存十年。

身份证存十年。

日志永远不删。

最终形成一个巨大的“数据炸药库”。

平时看不出问题。

一旦泄漏,损失巨大。

所以真正成熟的数据治理应该遵循三个原则:

第一原则:最小采集

能不收集就不收集。

第二原则:最小存储

能删就删。

第三原则:最小暴露

能脱敏就脱敏。


写在最后

脱敏和可逆脱敏,从来不是谁先进谁落后的问题。

而是业务价值与数据安全之间的一场长期博弈。

如果数据永远不需要恢复,那么Hash脱敏就是最好的选择。

如果业务必须恢复,那么加密或Tokenization才有价值。

但请记住一句话:

脱敏解决的是“看不见”,可逆脱敏解决的是“看得见但受控制”,而真正的数据安全,解决的是“即使泄漏也没有价值”。

当越来越多企业开始建设数据中台、AI平台和统一数据湖的时候,脱敏已经不是一个技术细节,而是决定企业数据资产能否安全流通的基础设施。

数据的价值在于流动,而数据安全的价值,在于让这种流动能够持续。只有在安全与效率之间找到平衡,企业的数据战略才真正具备长期生命力。

目录
相关文章
|
3月前
|
自然语言处理 PyTorch 算法框架/工具
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
784 10
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
|
3月前
|
监控 算法 数据可视化
别再瞎调学习率了:一套用 Python 搞定“自动调参 + 训练监控”的实战方案
别再瞎调学习率了:一套用 Python 搞定“自动调参 + 训练监控”的实战方案
283 4
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
动态图 vs 静态图:深度学习框架到底该怎么选?别再被“概念战”忽悠了
动态图 vs 静态图:深度学习框架到底该怎么选?别再被“概念战”忽悠了
371 6
|
3月前
|
运维 监控 网络协议
别再说 IPv6 只是“未来”了:我在生产环境踩过的那些坑
别再说 IPv6 只是“未来”了:我在生产环境踩过的那些坑
708 3
|
3月前
|
算法 搜索推荐 大数据
别再怪模型不聪明了:冷启动,本质是你“没喂饱”数据
别再怪模型不聪明了:冷启动,本质是你“没喂饱”数据
510 2
|
4月前
|
数据采集 供应链 物联网
别再只会调用 API 了:一步步教你用 Python Fine-Tune 一个定制化大模型
别再只会调用 API 了:一步步教你用 Python Fine-Tune 一个定制化大模型
531 4
|
4月前
|
运维 Kubernetes 安全
CNI 不是装完就完事:Calico、Cilium、Weave,选错一个,集群网络天天加班
CNI 不是装完就完事:Calico、Cilium、Weave,选错一个,集群网络天天加班
411 8
|
4月前
|
运维 Kubernetes Linux
Kubernetes 网络一出事,先别重启:一条从 Pod 打到内核的排查路线图
Kubernetes 网络一出事,先别重启:一条从 Pod 打到内核的排查路线图
308 4
|
4月前
|
人工智能 机器人 API
从“调个 API”到“自己养模型”:用 Python 快速构建聊天机器人的完整路径
从“调个 API”到“自己养模型”:用 Python 快速构建聊天机器人的完整路径
515 4
|
3月前
|
机器学习/深度学习 自然语言处理 搜索推荐
你的模型真的“懂”吗?用 Captum / SHAP 把神经网络扒开给你看
你的模型真的“懂”吗?用 Captum / SHAP 把神经网络扒开给你看
460 4

热门文章

最新文章