如何在python中存储帐户信息,以便以后访问?

时间:2014-03-01 04:57:17

标签: python account

python中常见的问题是如何存储用户信息,如用户名,密码和游戏内资金,以便以后可以访问。这可能吗?如果是这样,它是如何完成的?

2 个答案:

答案 0 :(得分:1)

尝试pickle和SQLite ......都适用于这种情况:)

答案 1 :(得分:1)

这取决于安全对您的重要性。

通常,如果存储的信息和要读取的程序在同一台机器上可用,则无法安全地存储数据。 在这种情况下,安全主要是为了防止操纵。

只要攻击者可以研究该程序以查看它如何存储信息,他就可以阅读该信息。你能做的最好就是混淆它。

要验证用户输入的凭据,您可以不存储用户名和密码本身,而是存储它们的哈希值。哈希函数是不可逆的,因此无法撤消。

In [1]: import hashlib

In [2]: data = {'user': hashlib.sha256('Roland').hexdigest(), 'password' : hashlib.sha256('mysecretpassword').hexdigest(), 'amount': 273}

In [3]: data
Out[3]: {'amount': 273, 'password': '94aefb8be78b2b7c344d11d1ba8a79ef087eceb19150881f69460b8772753263', 'user': 'a1ef7bf9b9098c49c8aa4e6e8b42b199762a55f85ec6ad215a76045088276fcc'}

要使用它,请对用户输入进行哈希处理并将其与存储的哈希值进行比较。

In [45]: hashlib.sha256('Ronald').hexdigest() == data['user']
Out[45]: False

In [46]: hashlib.sha256('Roland').hexdigest() == data['user']
Out[46]: True

存储数据的灵活方法是使用json。您可以通过这种方式轻松保存和加载字典或字典列表。

In [4]: import json

In [5]: datastring = json.dumps(data)

In [6]: datastring
Out[6]: '{"amount": 273, "password": "94aefb8be78b2b7c344d11d1ba8a79ef087eceb19150881f69460b8772753263", "user": "a1ef7bf9b9098c49c8aa4e6e8b42b199762a55f85ec6ad215a76045088276fcc"}'

In [7]: json.loads(datastring)
Out[7]: {u'amount': 273, u'password': u'94aefb8be78b2b7c344d11d1ba8a79ef087eceb19150881f69460b8772753263', u'user': u'a1ef7bf9b9098c49c8aa4e6e8b42b199762a55f85ec6ad215a76045088276fcc'}

请注意,虽然用户名和密码不可读,但该数量是可读的,可以在磁盘上更改。问题是你不能散列金额,因为你无法取消它。

你可以,例如压缩数据以对其进行模糊处理。

In [8]: import bz2

In [9]: bz2.compress(datastring)
Out[9]: 'BZh91AY&SY\xbf\x86\x82)\x00\x00T\x99\x80P\x04\x7f\xf0?\x03\xde\x8a \x00\x8a\x88\xa9\xf8\x93\xd4\xf4\xa7\xe4\xc9!\xfa\x88\xd0\n4\xf4\x91\xfa\x81\x00\x01\xa3\x00`:\x9e\xdey?\xa2\x1e\x12\xf3\xbeC\xb9\xb1f\x80\xf6\xaa6\xc5[\xad\\\xac\xf3e\xa8\xb0\xdf:!{\xe5\x10\xae\xae\x07p\xc0\xc3\x14*.\xa0j$\xda\t\xb9K\xa7\\\x81\x11\xa1@\x06\xc4C\x8b\xae\xbc\xc2\xa0\x0e\x1e#H\x91%\xd1\n\x9drS-\x97e_lb\x97C\x0fm\xe6\xb0\xb2\xc2V\x10\x7f\xc9\xf8\xbb\x92)\xc2\x84\x85\xfc4\x11H'

In [10]: len(bz2.compress(datastring))
Out[10]: 157

In [11]: len(datastring)
Out[11]: 171

In [12]: compressed = bz2.compress(datastring)

乍一看压缩数据将无法读取。

阅读数据仍然非常简单:

In [13]: json.loads(bz2.decompress(compressed))
Out[13]: {u'amount': 273, u'password': u'94aefb8be78b2b7c344d11d1ba8a79ef087eceb19150881f69460b8772753263', u'user': u'a1ef7bf9b9098c49c8aa4e6e8b42b199762a55f85ec6ad215a76045088276fcc'}

然而,攻击者可以使用例如UNIX上的file命令用于确定存储数据的性质;

In [18]: with open('data.bin', 'w') as storage:
   ....:     storage.write(compressed)
   ....:     

> file data.bin 
data.bin: bzip2 compressed data, block size = 900k