在 python 中以安全、space 高效的方式存储高分

Storing highscores in a secure, space efficient way in python

我在python做了一个游戏,它产生了相当多的高分,我想存储,优先考虑安全性、存储效率和易用性。目前我将它们存储在字典中,其中包含引用不同级别类型的键,然后将其写入 .txt 文件并使用 eval.
检索 编辑:我现在意识到这是个坏主意,我正在使用json。然而,该文件仍然清晰可辨,可以添加的任何加密都是有益的。

import os

#Reading from file
try:
    with open(os.path.join(root_directory, 'highscores.txt'), 'r') as f:
        highscores = eval(f.read())
except IOError:
    highscores = dict()

#Writing to file
with open(os.path.join(root_directory, 'highscores.txt'), 'w') as f:
    f.write(highscores)

但是,我在使用此方法时遇到了一些问题,希望得到一些建议。

是否值得制作一个 Highscore class 来使用 serializedeserialize 方法,是否有任何额外的安全性 could/should 添加到这个?

JSON 是存储分数的好格式。如果您担心文件大小,可以 gzip 压缩 JSON 文件,尽管这可能会影响性能。

如果您的用户可以访问源代码,我怀疑是否有一种好的方法可以通过仔细检查代码来加密无法撤消的文件。如果它 "compiled" 变成一种源代码不太友好的格式,那么你可能会进行一些加密,尽管密钥会在某处。

JSON 和 gzip 似乎是标准 python 安装的一部分,同时还有一些看似不错的加密库,例如 Simple-Crypt and Crypto 需要安装.

但是,如果您可能有多个进程可能更新此文件(例如多个玩家同时玩),您可能 运行 发生冲突导致文件损坏。正如其他人在这里所建议的那样,某种数据库将是更好的解决方案。

正如评论中所建议的,JSON 似乎是您项目的理想存储方法。下面是您的代码的修改版本,它已被修改为读取和写入 JSON 到您的 highscores.txt 文件。

import os
import json

#Reading from file
try:
    with open(os.path.join(root_directory, 'highscores.txt'), 'r') as f:
        highscores = json.load(f)
except IOError:
    highscores = dict()

#Writing to file
with open(os.path.join(root_directory, 'highscores.txt'), 'w') as f:
    json.dump(highscores, f)

关于安全性,要写入文本文件,您可能希望将高分编码为 JSON;加密 JSON 的数据;将加密的 JSON' 数据写入文本文件。然后要读取这些数据,只需按照我们执行它的顺序反转我们刚刚执行的操作。如果您四处搜索,您会发现 Python 必须提供的多个有用的密码学库。祝你好运!