ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

影刀RPA新手教程:数据脱敏与隐私保护实战——合规处理敏感数据

影刀RPA新手教程:数据脱敏与隐私保护实战——合规处理敏感数据 影刀RPA新手教程数据脱敏与隐私保护实战——合规处理敏感数据0. 为什么要做脱敏采集回来的数据里可能全是敏感信息客户手机号、身份证号、邮箱、家庭地址、银行卡号。直接存是违规的个人信息保护法第17条但要分析业务数据又离不开这些字段。解决方案脱敏。脱敏就是在保留数据特征的前提下抹去可识别个人身份的部分。比如手机号13812345678 → 138****5678保留了运营商段和后4位做业务分析。这篇给脱敏的正则表达式、加密存储方案和配置化规则表。1. 认识影刀与安装脱敏流程需要安装cryptography库用于加密pip install cryptography影刀的Python环境安装加密库时可能遇到编译错误cryptography依赖C扩展。解决不要pip install cryptography用预编译的wheel包。从pypi.org下载对应Python版本和Windows版本的.whl文件本地pip install路径。影刀自带的Python是32位的还是64位的要确认好。打开Python代码块输入import struct; print(struct.calcsize(P) * 8)32位打印32、64位打印64。2. 元素定位四合一敏感数据可能来自多种数据源每种定位方式不同Excel文件中的数据openpyxl读取定位到具体Sheet和列。源文件路径统一放在配置文件里conf/source_path.txt。网页上的用户列表用批量数据抓取指令选中用户信息表格一次性导出所有行的名称、手机、邮箱列。CSV/文本文件Python的csv模块直接读注意encoding——不是所有文件都是UTF-8很多是GBK。读之前先探测编码先用chardet包chardet.detect(raw_bytes)90%准确率。API返回的JSON数据response.json()后按key取值敏感字段通常是phone/mobile/id_card/email/address这些命名。3. 变量与数据类型脱敏规则配置表的数据结构——不建议把正则硬编码在代码里用配置文件让运营也能改规则rules{手机号:{regex:r1[3-9]\d{9},method:mask_middle,params:{keep_head:3,keep_tail:4,mask_char:*}},身份证:{regex:r\d{17}[\dXx],method:mask_middle,params:{keep_head:6,keep_tail:4,mask_char:*}},邮箱:{regex:r[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,},method:mask_email,params:{keep_head:3,mask_char:*}},银行卡:{regex:r\d{16,19},method:mask_middle,params:{keep_head:6,keep_tail:4,mask_char:*}},地址:{regex:None,# 不用正则用前后缀匹配method:mask_address,params:{keep_level:2}# 保留到市级}}脱敏方法实现importredefmask_middle(text,keep_head3,keep_tail4,mask_char*):iflen(text)keep_headkeep_tail:returntextreturntext[:keep_head]mask_char*(len(text)-keep_head-keep_tail)text[-keep_tail:]4. 流程控制脱敏主流程读数据文件 → 解析表头找到敏感字段 → 根据字段名匹配脱敏规则 → 逐条脱敏 → 写入脱敏版Excel → 原始数据加密。字段名匹配不是精确匹配是模糊匹配——用户手机、联系电话、mobile_phone都要匹配到手机号规则。实现FIELD_MAPPING{手机号:[手机,电话,mobile,phone,tel,contact],身份证:[身份证,id_card,idcard,证件号],邮箱:[邮箱,email,mail,e-mail],银行卡:[银行卡,bank_card,卡号,account],地址:[地址,住址,address,通讯地]}defmatch_rule(field_name):field_lowerfield_name.lower()forrule_name,keywordsinFIELD_MAPPING.items():forkwinkeywords:ifkwinfield_lower:returnrule_namereturnNone# 非敏感字段不需要脱敏脱敏时加上异常处理forrow_idxinrange(2,ws.max_row1):forcol_idx,headerinenumerate(headers,1):cell_valuestr(ws.cell(rowrow_idx,columncol_idx).valueor)rule_namematch_rule(header)ifrule_nameandcell_value:rulerules[rule_name]try:maskedapply_mask(cell_value,rule)exceptExceptionase:print(f脱敏失败(R{row_idx}C{col_idx}):{e})masked***脱敏失败***masked_ws.cell(rowrow_idx,columncol_idx,valuemasked)else:masked_ws.cell(rowrow_idx,columncol_idx,valuecell_value)5. 网页自动化如果敏感数据需要从网页上采集后再脱敏核心是要有个中间态——采集下来先在内存里脱敏再存盘。不要先存盘再脱敏中间那段时间原始数据已经留在磁盘上了。影刀流程打开网页 → 获取元素列表 → 循环每个元素取text → 在Python代码块里脱敏 → 存入变量 → 循环结束后统一写入Excel。全程不落地原始数据。如果要采集的数据量太大不得不中途落盘落盘后马上加文件锁——用Python的os.chmod(path, 0o600)设置只有当前用户可读写。脱敏完成后删除临时文件os.remove(path)。6. 数据处理核心正则表达式都在这了拿去直接能用# 手机号支持86前缀、空格、短横线PHONE_REGEXr(?:\86[-\s]?)?1[3-9]\d[-\s]?\d{4}[-\s]?\d{4}# 身份证18位末尾X不区分大小写ID_CARD_REGEXr\d{17}[\dXx]# 邮箱EMAIL_REGEXr[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}# 银行卡16-19位数字BANK_CARD_REGEXr\d{16,19}# IPv4地址IP_REGEXr\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}邮箱脱敏不是简单mask_middledefmask_email(email,keep_head3,mask_char*):name,domainemail.split()masked_namemask_middle(name,keep_headkeep_head,keep_tail0,mask_charmask_char)# 域名部分只保留一级域名前面用*替代domain_partsdomain.split(.)masked_domainmask_char*3...join(domain_parts[1:])returnmasked_namemasked_domain# 输出示例zha******.com地址脱敏保留省/市级defmask_address(address):# 匹配省、自治区、直辖市province_matchre.match(r([^省]省|[^市]市|[^区]自治区),address)# 匹配市city_matchre.search(r([^市]市),address)resultifprovince_match:resultprovince_match.group(0)ifcity_match:resultcity_match.group(0)result******returnresult# 浙江省杭州市西湖区文三路100号 → 浙江省杭州市******7. 鼠标键盘图像自动化数据脱敏一般不涉及鼠标键盘操作。但如果脱敏后要发布到某个系统比如CRM系统里更新客户信息可能涉及网页表单填写。影刀打开CRM系统 → 定位到对应客户编辑页 → 脱敏后的数据通过「写入文本」指令填入输入框 → 点击保存。这一过程和正常的RPA表单填写一样只是数据是脱敏后的版本。8. 进阶技能加密存储原始数据脱敏后不能直接丢弃审计时需要还原。原始数据要用AES加密存储。fromcryptography.fernetimportFernetimportosimportbase64importhashlibdefgenerate_key(password):# 从密码生成32字节密钥digesthashlib.sha256(password.encode()).digest()returnbase64.urlsafe_b64encode(digest)defencrypt_file(input_path,output_path,password):keygenerate_key(password)fernetFernet(key)withopen(input_path,rb)asf:dataf.read()encryptedfernet.encrypt(data)withopen(output_path,wb)asf:f.write(encrypted)defdecrypt_file(input_path,output_path,password):keygenerate_key(password)fernetFernet(key)withopen(input_path,rb)asf:encryptedf.read()try:decryptedfernet.decrypt(encrypted)exceptException:raiseValueError(密码错误或文件损坏)withopen(output_path,wb)asf:f.write(decrypted)密码不要硬编码。用环境变量读取password os.environ.get(ENCRYPT_KEY, default_fallback_key)。生产环境里通过影刀的「配置变量」设置和代码解耦。加密后的文件扩展名用.enc标记一眼就看出是加密文件不会误打开。9. 平台实战Excel数据脱敏数据库脱敏Excel数据脱敏最常见场景运营从网站导出的客户列表要发给市场部做分析但数据含手机号身份证。方案准备一个Excel模板第一行是列名。下面是一个Python脚本接受一个规则配置JSON读取Excel、匹配列名、脱敏、输出到新文件defdesensitize_excel(input_file,output_file,rules_config):wbopenpyxl.load_workbook(input_file)wswb.active headers[cell.valueforcellinws[1]]# 构建脱敏映射col_rules{}forcol_idx,headerinenumerate(headers):rule_namematch_rule(str(header))ifrule_name:col_rules[col_idx1]rules_config[rule_name]# 处理每一行out_wbopenpyxl.Workbook()out_wsout_wb.activeforrow_idxinrange(1,ws.max_row1):forcol_idxinrange(1,ws.max_column1):valws.cell(rowrow_idx,columncol_idx).valueifrow_idx1:# 表头原封out_ws.cell(rowrow_idx,columncol_idx,valueval)elifcol_idxincol_rulesandval:maskedapply_mask(str(val),col_rules[col_idx])out_ws.cell(rowrow_idx,columncol_idx,valuemasked)else:out_ws.cell(rowrow_idx,columncol_idx,valueval)out_wb.save(output_file)数据库脱敏直接用SQL做脱敏比Python更快。10万行数据用SQL UPDATE一条就跑完Python循环10万次要几分钟。-- MySQL手机号脱敏UPDATEcustomersSETphoneCONCAT(LEFT(phone,3),****,RIGHT(phone,4));-- 身份证脱敏UPDATEcustomersSETid_cardCONCAT(LEFT(id_card,6),********,RIGHT(id_card,4));-- 邮箱脱敏UPDATEcustomersSETemailCONCAT(LEFT(email,3),******.,SUBSTRING_INDEX(email,.,-1));但是注意不要直接在原表上UPDATE。先CREATE TABLE xxx_desensitized AS SELECT在新表上做脱敏。原表数据不动加密备份后可以还原。10. 系统联动脱敏整个流程串起来采集原始数据 → 脱敏 → 写入脱敏版文件 → 原始数据加密 → 删除原始明文文件 → 发送通知。通知包含脱敏统计defnotify_stats(stats):textf【数据脱敏完成】 处理行数{stats[total_rows]}脱敏字段数{stats[masked_fields]}手机号脱敏{stats[phone_count]}条 身份证脱敏{stats[id_card_count]}条 邮箱脱敏{stats[email_count]}条 脱敏规则版本{stats[rules_version]}处理时间{stats[elapsed]}秒requests.post(WEBHOOK_URL,json{msgtype:markdown,markdown:{content:text}})脱敏日志写入审计文件按日期分割。每条记录包含时间、文件名、处理行数、脱敏规则版本、加密状态、操作人。配一个「查看日志」的简单HTML页面方便审计。home.linyan.cloud上有脱敏规则模板的下载链接包含常见50种敏感字段的正则表达式。11. 工程化与规范脱敏工程的规范一、规则版本管理。脱敏规则存JSON文件用Git管理。每次修改规则打tagv1.0.0→v1.1.0。每条脱敏记录写上规则版本号出了问题知道是哪个版本的时候出的。二、测试脱敏。修改规则后跑测试集不是跑真实数据。测试集包含所有字段类型的样本数据验证脱敏结果是否符合预期test_data{手机号:{input:13812345678,expected:138****5678},身份证:{input:330106199001011234,expected:330106********1234},邮箱:{input:zhangsanexample.com,expected:zha******.com},地址:{input:浙江省杭州市西湖区文三路100号,expected:浙江省杭州市******}}三、不要过度脱敏。商品名称、价格、订单号这些不是个人敏感信息不要脱敏。脱敏太猛数据就没分析价值了。只脱敏能标识到个人的字段。四、加密密钥轮换。一套密钥用超过6个月要更换换密钥的同时要把已加密文件用旧密钥解密再用新密钥加密。12. 速查表与常见报错正则速查数据类型正则脱敏后示例手机号r1[3-9]\d{9}138****5678身份证r\d{17}[\dXx]330106********1234邮箱r[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}zha******.com银行卡r\d{16,19}622202****1234固话r0\d{2,3}-\d{7,8}0571-****1234邮编r[1-9]\d{5}310***常见报错cryptography.fernet.InvalidToken解密密码错误。原因用了不同密码加密的文件用当前密码解密。记住加密解密必须是同一个密码不存在找回密码。re.error: bad escape正则表达式写错了。检查反斜杠Python字符串里\d不需要转义\\d才算一个反斜杠加字母d。用raw stringr\d{9}避免这类问题。脱敏后的数据仍然可以反推个人信息比如脱敏了手机号和身份证但姓名地址生日性别四要素组合能唯一确定这个人。这种情况要么把姓名也脱敏保留姓、生日去掉日期只保留年份、性别保留。脱敏Excel文件比原文件还大正常的因为脱敏后每个字段长度可能变长比如手机号11位变成11个星号也是11位但身份证18位变18位保持不变。真正的问题是编码——保存时用utf-8不要用utf-8-sig后者会加BOM头导致文件大一点点。PermissionError: [Errno 13] Permission denied文件被其他程序打开比如Excel正在查看无法读写。关闭文件再跑流程。内容标签影刀RPA、数据脱敏、隐私保护、正则表达式、加密存储、个人信息保护法、AES加密作者林焱
返回列表