当使用pickle lib和我创建的一些类时,输出对用户来说相当容易阅读。例如,如果我有一个名为“存储”的填充,并将我的所有类数据保存到其中的.save文件中,则在使用文本编辑器打开文件时,您可以模糊地查看所有变量并且不需要太多挣扎,将它们更改为期望的结果。
这是我用pickle创建的保存文件的片段(这是游戏):
S'Strength'
p4
I5
sS'Health'
p8
I100
这就是'健康'的价值。是100和'力量'是5,如果用户要编辑保存文件(因为它将在本地保存),他们可以轻松更改他们想要的任何变量以欺骗游戏。
因为我正在制作一款游戏,其中保存游戏是我计划实施的功能之一,这已经成为一个问题。
我确实考虑使用加密,但是使用第二个外部库是最后的手段,因为它可能非常繁琐,所以我想知道是否还有其他方法可以做到这一点,或者如果pickle带有内置在这个功能中(在研究之后我还没有看到)。
答案 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)
请注意,这是非常不安全的,只是为了阻止玩家认为它实际上是加密的。