【问题标题】:Storing highscores in a secure, space efficient way in python在 python 中以安全、节省空间的方式存储高分
【发布时间】:2015-08-12 23:15:14
【问题描述】:

我用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)

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

  • 我想减小文件大小。压缩文件确实有很大的不同,但任何更有效的格式都会更好。
  • 我想让它更安全。理想情况下,我希望熟悉 python 的玩家很难弄清楚如何编辑高分。
  • 我想让它更容易更新高分的主副本,并在分布式副本中添加新内容,特别是在字典中使用元组键相当笨拙。

是否值得创建一个使用serializedeserialize 方法的Highscore 类,是否可以/应该添加任何额外的安全性?

【问题讨论】:

  • 结果文件大小是多少?
  • 使用 JSON。不是pickle,不是eval() 在.txt 文件中的字典上; JSON :)。
  • 我会在这里查看更多信息(虽然不是加密):stackoverflow.com/questions/28326725/…
  • 这正是 postgres、redis、mongodb、mysql 等为...创建的东西。
  • @Siwel json 更安全(如果您使用simplejson,速度更快)...如果我将我的用户名设为os.system("format C:") 并且您运行您可能不喜欢的eval结果

标签: python python-2.7 encryption serialization pickle


【解决方案1】:

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

如果您的用户可以访问源代码,我怀疑是否存在加密文件的好方法,但仔细检查代码是无法撤消的。如果它被“编译”成对源代码不太友好的格式,那么您可能会进行一些加密,尽管密钥会在某处。

JSON 和 gzip 似乎是标准 python 安装的一部分,而有几个看似广受好评的加密库,例如需要安装的 Simple-CryptCrypto

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

【讨论】:

  • 我使用py2exe,所以源代码不应该很容易获得。目前我并不太担心安全性,但基本级别的安全性会很好。
  • 如果你想让它去中心化,你应该看看 postgres 什么的......(但你需要一个服务器)
  • HDF5 存储是一个选项。它是压缩的,可以与 MPI (mpi4py.scipy.org/docs/usrman/index.html) 并行访问,也可以通过 OPeNDAP (hdfeos.org/software/hdf5_handler.php) 远程访问,可在许多平台上使用,可移植且可共享。它的 Python API 由 h5py 包 (h5py.org) 提供。 Andrew Collette 的 O'Reilly 书“Python 和 HDF5”提供了该 API 的附加文档。 HDF5项目网站是hdfgroup.org/HDF5
  • 标准 python 安装包含哪些加密模块?
  • 看起来我有点误会了。我把这些——docs.python.org/2/library/crypto.html——当作加密/解密,但它们似乎只是散列函数。但看起来 Crypto 或 Simple-Crypt 是很好的可能性。我已经更新了我的答案以反映这一点。
【解决方案2】:

正如 cmets 中所建议的,JSON 似乎确实是您项目的理想存储方法。以下是您的代码的修改版本,该版本已被修改为在您的 highscores.txt 文件中读取和写入 JSON。

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 必须提供的多个有用的密码库。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2012-10-08
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多