本文目录导读:

我来详细介绍Python操作数据库静态脱敏的方法:
基础架构
import pymysql
import hashlib
import random
import string
from typing import Any, Dict, List
from dataclasses import dataclass
@dataclass
class SensitiveField:
"""敏感字段配置"""
table: str
column: str
mask_type: str # mask, hash, random, simulate
params: dict = None
常用脱敏方法
class DataMasker:
"""数据脱敏器"""
@staticmethod
def mask_phone(phone: str) -> str:
"""手机号脱敏: 138****1234"""
if len(phone) == 11:
return phone[:3] + "****" + phone[7:]
return phone
@staticmethod
def mask_id_card(id_card: str) -> str:
"""身份证脱敏: 110101****1234"""
if len(id_card) == 18:
return id_card[:6] + "********" + id_card[-4:]
return id_card
@staticmethod
def mask_email(email: str) -> str:
"""邮箱脱敏: a***@example.com"""
if "@" in email:
name, domain = email.split("@")
return name[0] + "***" + "@" + domain
return email
@staticmethod
def mask_name(name: str) -> str:
"""姓名脱敏: 张*"""
if len(name) >= 2:
return name[0] + "*" * (len(name) - 1)
return name
@staticmethod
def hash_data(data: str, algorithm: str = 'sha256') -> str:
"""哈希脱敏"""
hash_func = getattr(hashlib, algorithm)
return hash_func(data.encode()).hexdigest()
@staticmethod
def random_string(length: int = 10) -> str:
"""生成随机字符串"""
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
数据库操作核心类
class DatabaseMasker:
"""数据库脱敏处理器"""
def __init__(self, db_config: dict):
self.db_config = db_config
self.connection = None
def connect(self):
"""连接数据库"""
self.connection = pymysql.connect(**self.db_config)
def disconnect(self):
"""关闭连接"""
if self.connection:
self.connection.close()
def get_table_data(self, table: str, columns: List[str],
batch_size: int = 1000) -> List[Dict]:
"""分批获取表数据"""
cursor = self.connection.cursor(pymysql.cursors.DictCursor)
columns_str = ', '.join(columns)
offset = 0
while True:
sql = f"""
SELECT {columns_str}
FROM {table}
LIMIT {batch_size} OFFSET {offset}
"""
cursor.execute(sql)
rows = cursor.fetchall()
if not rows:
break
yield rows
offset += batch_size
cursor.close()
def update_data(self, table: str, data: List[Dict],
primary_key: str = 'id'):
"""更新脱敏后的数据"""
cursor = self.connection.cursor()
for row in data:
updates = []
params = []
for column, value in row.items():
if column != primary_key:
updates.append(f"{column} = %s")
params.append(value)
params.append(row[primary_key])
sql = f"""
UPDATE {table}
SET {', '.join(updates)}
WHERE {primary_key} = %s
"""
cursor.execute(sql, params)
self.connection.commit()
cursor.close()
完整脱敏流程
class DataDesensitization:
"""数据脱敏主流程"""
def __init__(self, db_config: dict, sensitive_fields: List[SensitiveField]):
self.masker = DatabaseMasker(db_config)
self.sensitive_fields = sensitive_fields
self.mask_method = DataMasker()
def execute(self):
"""执行脱敏"""
try:
self.masker.connect()
for field in self.sensitive_fields:
print(f"正在脱敏: {field.table}.{field.column}")
self._process_field(field)
print("脱敏完成!")
except Exception as e:
print(f"脱敏失败: {e}")
self.masker.connection.rollback()
finally:
self.masker.disconnect()
def _process_field(self, field: SensitiveField):
"""处理单个字段"""
for batch_data in self.masker.get_table_data(
field.table,
['id', field.column]
):
for row in batch_data:
original_value = row[field.column]
if original_value:
row[field.column] = self._apply_mask(
original_value,
field.mask_type,
field.params
)
self.masker.update_data(
field.table,
batch_data,
primary_key='id'
)
def _apply_mask(self, value: Any, mask_type: str, params: dict = None) -> Any:
"""应用脱敏规则"""
if not value:
return value
if mask_type == 'phone':
return self.mask_method.mask_phone(str(value))
elif mask_type == 'id_card':
return self.mask_method.mask_id_card(str(value))
elif mask_type == 'email':
return self.mask_method.mask_email(str(value))
elif mask_type == 'name':
return self.mask_method.mask_name(str(value))
elif mask_type == 'hash':
algorithm = params.get('algorithm', 'sha256') if params else 'sha256'
return self.mask_method.hash_data(str(value), algorithm)
elif mask_type == 'random':
length = params.get('length', 10) if params else 10
return self.mask_method.random_string(length)
elif mask_type == 'faker':
return self._fake_data(value, params)
else:
raise ValueError(f"不支持的脱敏类型: {mask_type}")
使用示例
# 数据库配置
db_config = {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'password',
'database': 'test_db',
'charset': 'utf8mb4'
}
# 配置敏感字段
sensitive_fields = [
SensitiveField(table='users', column='phone', mask_type='phone'),
SensitiveField(table='users', column='email', mask_type='email'),
SensitiveField(table='users', column='id_card', mask_type='id_card'),
SensitiveField(table='users', column='password',
mask_type='hash', params={'algorithm': 'sha256'}),
SensitiveField(table='address', column='name', mask_type='name'),
]
# 执行脱敏
desensitization = DataDesensitization(db_config, sensitive_fields)
desensitization.execute()
性能优化版本
class OptimizedDatabaseMasker(DatabaseMasker):
"""优化版的数据库脱敏器"""
def __init__(self, db_config: dict):
super().__init__(db_config)
self.batch_update_size = 500
def batch_update(self, table: str, data: List[Dict],
primary_key: str = 'id'):
"""批量更新优化"""
if not data:
return
cursor = self.connection.cursor()
# 构建批量更新SQL
update_columns = [col for col in data[0].keys() if col != primary_key]
case_statements = []
for column in update_columns:
case_sql = f"{column} = CASE {primary_key}\n"
for row in data:
case_sql += f" WHEN %s THEN %s\n"
case_sql += "END"
case_statements.append(case_sql)
sql = f"""
UPDATE {table}
SET {', '.join(case_statements)}
WHERE {primary_key} IN ({','.join(['%s'] * len(data))})
"""
# 准备参数
params = []
for column in update_columns:
for row in data:
params.append(row[primary_key])
params.append(row[column])
params.extend([row[primary_key] for row in data])
cursor.execute(sql, params)
self.connection.commit()
cursor.close()
配置文件方式
# mask_config.yaml
database:
host: localhost
port: 3306
user: root
password: password
database: test_db
mask_rules:
- table: users
columns:
- name: phone
type: phone
- name: email
type: email
- name: password
type: hash
params:
algorithm: sha256
- table: orders
columns:
- name: receiver_name
type: name
- name: receiver_phone
type: phone
注意事项
- 备份数据:脱敏前务必备份原始数据
- 分批处理:避免大数据量时内存溢出
- 事务管理:确保数据一致性
- 并行处理:多线程处理不同表
- 验证结果:脱敏后验证数据完整性
- 性能监控:监控处理进度和性能
这个框架可以根据具体需求扩展,支持更多脱敏规则和数据源。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播