如何将pickle输出转换为不可读的格式

时间:2016-12-06 21:39:36

标签: python python-3.x pickle

当使用pickle lib和我创建的一些类时,输出对用户来说相当容易阅读。例如,如果我有一个名为“存储”的填充,并将我的所有类数据保存到其中的.save文件中,则在使用文本编辑器打开文件时,您可以模糊地查看所有变量并且不需要太多挣扎,将它们更改为期望的结果。

这是我用pickle创建的保存文件的片段(这是游戏):

S'Strength'
p4
I5
sS'Health'
p8
I100

这就是'健康'的价值。是100和'力量'是5,如果用户要编辑保存文件(因为它将在本地保存),他们可以轻松更改他们想要的任何变量以欺骗游戏。

因为我正在制作一款游戏,其中保存游戏是我计划实施的功能之一,这已经成为一个问题。

我确实考虑使用加密,但是使用第二个外部库是最后的手段,因为它可能非常繁琐,所以我想知道是否还有其他方法可以做到这一点,或者如果pickle带有内置在这个功能中(在研究之后我还没有看到)。

2 个答案:

答案 0 :(得分:5)

您可以简单地对数据进行签名,然后在阅读时对其进行身份验证,而不是尝试使数据不可读

保存

这里使用hmac来计算哈希值。然后我们将哈希与数据一起保存:

import hmac, pickle

# pickle the data
pickled = pickle.dumps(data)
digest =  hmac.new("some-shared-key", pickled, 
                   digestmod=<my choice of hasher>
                   ).hexdigest()

# now save the hashed digest and the pickled data
with open("some-file", "wb") as f:
    # save these in some way you can distinguish them when you read them
    print(digest, file=f)
    print(pickled, file=f)

载入

为了验证数据,我们重新计算了腌制数据的摘要,并将其与保存在其中的摘要进行比较。

import hmac, pickle

with open("some-file", "rb") as f:
    digest = f.readline()
    pickled = f.read()

# confirm integrity
recomputed = hmac.new("some-shared-key", pickle, 
                       digestmod=<my choice of hasher>
                      ).hexdigest()
if not compare_digest(digest, recomputed):
    raise SomeOneIsCheatingOhNoException

答案 1 :(得分:1)

稍微混淆一点的一个想法是简单的十六进制转换或您选择的编码。对于十六进制我做(+12是随机噪音我猜)

mylist_obf = map(lambda item:int(item.encode('hex'))+12,mylist)

通过反向获取原件

my_original_list = map(lambda item: str(int(item)-12).decode('hex'),mylist_obf)

请注意,这是非常不安全的,只是为了阻止玩家认为它实际上是加密的。