2014-03-01 29 views

回答

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\[email protected]\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 
1

嘗試泡菜和SQLite ......在這種情況下:)

相關問題