如何在Python中存储账户信息以便后续访问?

-2 投票
2 回答
922 浏览
提问于 2025-04-17 20:24

在Python编程中,很多人都会问一个常见的问题,那就是怎么保存用户信息,比如用户名、密码和游戏中的钱,这样以后可以再用到。这种做法可行吗?如果可以的话,具体是怎么实现的呢?

2 个回答

1

试试用pickle和SQLite,这两种方法在这种情况下都能用哦 :)

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

撰写回答