InvalidToken 通过使用 Python 解密表中的列

问题描述 投票:0回答:2

有人知道如何解决无效令牌的问题吗?

密钥应该相同,但我仍然收到此无效令牌错误。

我附上了我的代码和一张假表的图片。

干杯!

import pandas as pd
from cryptography.fernet import Fernet, InvalidToken

# Create an example dataframe
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Salary': [50000, 70000, 90000]}
df = pd.DataFrame(data)

# Generate a key for encryption
key = Fernet.generate_key()

# Create a Fernet object using the key
f = Fernet(key)

# Encrypt the 'Salary' column
df['Salary'] = df['Salary'].apply(lambda x: f.encrypt(str(x).encode()))

# Save the encrypted data to a CSV file
df.to_csv('encrypted_data.csv', index=False)

# Load the encrypted data from the CSV file
df = pd.read_csv('encrypted_data.csv')

# Decrypt the 'Salary' column
try:
  df['Salary'] = df['Salary'].apply(lambda x: int(f.decrypt(x.encode()).decode()))
except InvalidToken as e:
  print(f"Error: {e}")
  print(f"Key: {key}")
  raise

# Print the decrypted data
print(df)

我尝试了上面的代码,期望解密列工资。但是,我得到了一个 invalidtoken 错误。

python-3.x encryption privacy data-masking
2个回答
1
投票

f.encrypt(...)
返回一个类似字节的对象。当使用
to_csv()
存储时,字符串表示被存储
b'...'
,可以在您的屏幕截图中看到。
当使用
read_csv()
加载时,此字符串被加载并且
x.encode()
导致
b"b'...'"
导致解密失败。

为避免这种情况,加密时必须对密文进行 UTF-8 解码:

df['Salary'] = df['Salary'].apply(lambda x: f.encrypt(str(x).encode()).decode())

然后解密工作和

print(df)
返回加密和解密数据:


0
投票

感谢@Topaco 指出错误。现在它就像一个魅力。

问题: 如果在一张表中,我有多个列需要加密, ['Salary', 'SocialNumber'] 分别是整数和字符串类型,例如:

data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Salary': [50000, 70000, 90000],
        'SocialNumber': ['AX12', 'ER56', 'ES11']}

加密是否保持不变(都应该是 str 类型?):

df['Salary'] = df['Salary'].apply(lambda x: f.encrypt(str(x).encode()).decode())
df['SocialNumber'] = df['SocialNumber'].apply(lambda x: f.encrypt(str(x).encode()).decode())

但只有解密应该考虑类型(int 和 str?):

df_new['Salary'] = df_new['Salary'].apply(lambda x: int(v.decrypt(x.encode()).decode()))
df_new['SocialNumber'] = df_new['SocialNumber'].apply(lambda x: str(v.decrypt(x.encode()).decode()))

再次感谢@Topaco!

© www.soinside.com 2019 - 2024. All rights reserved.