2015-02-24 59 views
1

這是我使用pickle的python密碼系統。我知道這很糟糕,但這是我第一次用泡菜。Python醃密碼

import pickle 
import os 

userlist = {'user1':'userpass1', 'user2':'userpass2'} 

users = open ("users.pkl", 'wb') 

pickle.dump (userlist, users) 

username = input ("Enter your username: ") 
password = input ("Enter your password: ") 

if (username in userlist) and (password == userlist[username]): 
    print ("Access Granted") 
else: 
    newaccount = input ("User not found. Shall I create a new account? ") 
    if newaccount == "yes": 
     username = input ("Please enter your username: ") 
     password = input ("Please enter yout password: ") 
     userlist.update({username:password}) 
     pickle.dump (userlist, users) 
     users.close() 

我的問題是,每當我去添加一個新的賬戶,使用該部分:

newaccount = input ("User not found. Shall I create a new account? ") 
    if newaccount == "yes": 
     username = input ("Please enter your username: ") 
     password = input ("Please enter yout password: ") 
     userlist.update({username:password}) 
     pickle.dump (userlist, users) 
     users.close() 

它似乎增加它(和它看起來像它的存在在使用泡菜文件記事本)但是,我重新啓動python文件,並沒有看到它。

我相信這是值得做這部分:

userlist = {'user1':'userpass1', 'user2':'userpass2'} 

users = open ("users.pkl", 'wb') 

pickle.dump (userlist, users) 

任何幫助表示讚賞! :d

+2

密碼屬於一個非常特殊的類別。即使是簡單的事情也應該用不同的密碼來完成,例如,不要以純文本形式存儲它們,也不要在源代碼中對密碼進行硬編碼。 – jfs 2015-02-24 11:14:02

+0

我知道,但這是學校 - 沒有必要。 – Bob 2015-02-25 10:49:10

回答

2

你每次與w運行程序時覆蓋:

users = open ("users.pkl", 'wb') 

如果你想獲得你需要看到,如果該文件已經存在,先前醃項目和pickle.load獲得先前酸菜項目,然後在您的代碼末尾輸入dump

類似以下內容:

from tempfile import NamedTemporaryFile 

try: 
    # see if we have run this before 
    with open ("users.pkl", 'rb') as users: 
     users_dict = pickle.load(users) 
except IOError: 
    # if not set to defualt 
    users_dict = {'user1':'userpass1', 'user2':'userpass2'} 


username = input ("Enter your username: ") 
password = input ("Enter your password: ") 

if users_dict.get(username) == password: # unless a password can be None we can use get 
    print ("Access Granted") 
else: 
    newaccount = input("User not found. Shall I create a new account? ") 
    if newaccount == "yes": 
     username = input("Please enter your username: ") 
     password = input ("Please enter yout password: ") 
     users_dict[username] = password # just use key = value 

with NamedTemporaryFile("wb",dir=os.path.dirname("users.pkl"),delete=False) as f: # in case we get exception use temp file 
    pickle.dump (users_dict, f) 
os.replace(f.name,"users.pkl") # update original 
+0

您無法寫入使用'rb'模式打開的文件。 – jfs 2015-02-24 11:10:58

+0

@ J.F.Sebastian,是的,謝謝,修復。 – 2015-02-24 11:16:16

+0

你也許應該爲'users'文件使用'with'語句(我不知道你是否可以在Windows上打開一個已經打開的文件)。寫入臨時文件並在末尾使用'os.replace()',否則如果在pickle.dump中發生錯誤,密碼數據庫將會丟失。如果這個程序的多個實例可能同時運行或者[突然斷電],這將無濟於事(http://stackoverflow.com/q/2333872/4279) – jfs 2015-02-24 11:24:40