You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

寻求支持双向假名化的Python库/方法:DataFrame姓名可还原假名化

解决双向假名化需求的方案

你提到的gocept.pseudonymize本质是单向哈希式的假名化,设计上就没法逆向还原——要实现双向操作,咱们得换用对称加密方案或者可逆向的映射系统,下面给你几个实用的实现方式:

方案1:用cryptography库的Fernet模块(推荐,安全且易用)

Fernet是一种开箱即用的对称加密标准,专门用来做安全的双向加密,非常适配你的场景:加密后的字符串完全不可识别,且只要妥善保存密钥,就能轻松还原原内容。

步骤:

  1. 先安装依赖库:
pip install cryptography
  1. 适配DataFrame的代码示例:
from cryptography.fernet import Fernet
import pandas as pd

# 第一步:生成并保存密钥(仅需生成一次,务必妥善保管!丢失密钥就无法还原数据了)
# key = Fernet.generate_key()
# with open("student_secret.key", "wb") as key_file:
#     key_file.write(key)

# 第二步:加载已保存的密钥
with open("student_secret.key", "rb") as key_file:
    key = key_file.read()
cipher = Fernet(key)

# 你的示例DataFrame(整理为规范格式)
df = pd.DataFrame({
    'Student': ['Stud1', 'Stud2', 'Stud3', 'Stud4', 'Stud5', 'Stud6', 'Stud7', 'Stud8', 'Stud9'],
    'Studendid': [1, 2, 3, 4, 5, 6, 7, 8, 9]
})

# 正向假名化:将姓名加密为不可识别的字符串
df['Pseudonymized_Student'] = df['Student'].apply(lambda name: cipher.encrypt(name.encode()).decode())

# 逆向还原:将假名解密回原姓名
df['Original_Student'] = df['Pseudonymized_Student'].apply(lambda pseudonym: cipher.decrypt(pseudonym.encode()).decode())

# 查看结果
print(df[['Student', 'Pseudonymized_Student', 'Original_Student']])

运行后你会看到,Pseudonymized_Student列是一串无意义的加密字符串,而Original_Student列能完美还原原姓名,完全满足你的双向需求。

方案2:自定义映射表(适合简单场景)

如果不需要极高的安全性,只是需要把姓名替换成不可识别的标识,你可以自己维护一个原姓名→假名的映射字典,逆向时反转字典即可:

import pandas as pd
import random
import string

# 生成自定义格式假名的工具函数(可按需调整格式,比如模仿你示例中的`ah274as`样式)
def create_custom_pseudonym():
    # 生成2个小写字母 + 3个数字 + 2个小写字母的格式
    letters_part1 = ''.join(random.choices(string.ascii_lowercase, k=2))
    digits_part = ''.join(random.choices(string.digits, k=3))
    letters_part2 = ''.join(random.choices(string.ascii_lowercase, k=2))
    return f"{letters_part1}{digits_part}{letters_part2}"

# 示例DataFrame
df = pd.DataFrame({
    'Student': ['Stud1', 'Stud2', 'Stud3', 'Stud4', 'Stud5'],
    'Studendid': [1, 2, 3, 4, 5]
})

# 创建原姓名到假名的映射(务必保存好这个字典,丢失则无法还原)
name_to_pseudonym = {}
for unique_name in df['Student'].unique():
    if unique_name not in name_to_pseudonym:
        name_to_pseudonym[unique_name] = create_custom_pseudonym()

# 正向假名化
df['Pseudonymized_Student'] = df['Student'].map(name_to_pseudonym)

# 逆向还原:反转映射字典
pseudonym_to_name = {v: k for k, v in name_to_pseudonym.items()}
df['Original_Student'] = df['Pseudonymized_Student'].map(pseudonym_to_name)

print(df)

这个方案的优点是假名格式可以完全自定义,但缺点是如果数据量很大,映射字典会非常庞大,且一旦丢失就彻底无法还原数据。

关键注意事项

不管用哪种方案,密钥/映射表的安全存储是核心——没有它们,你就无法完成逆向还原操作。另外,gocept.pseudonymize本身是单向哈希工具,设计上就不支持逆向,所以没法基于它实现你要的双向功能,必须换用上述方案。

内容的提问来源于stack exchange,提问作者user14540992

火山引擎 最新活动