2017-09-17 60 views
0

我想創建一個程序,要求用戶,在這個例子中,讓我們說一個用戶名和密碼,然後存儲這個(我假設在一個文本文件中)。我正在努力的領域是如何讓用戶更新存儲在文本文件中的密碼?我正在用Python寫這個。存儲用戶名和密碼,然後允許用戶更新。蟒蛇

+3

_ ** **請不要** **過店密碼爲純文本。他們需要被哈希和醃製,理想情況下不需要用你編寫的代碼。有大量的認證庫可用。無論如何,如果你使用數據庫作爲數據庫,那麼我認爲你的痛苦時間會少得多。它們旨在增加數據,查找數據,修改數據和直接刪除數據。 SQLite包含在Python中,並且相當容易使用。 – Chris

+0

Python中包含的另一個「數據庫」是[shelve](https://docs.python.org/3.6/library/shelve.html),它比SQLite更容易。 –

+2

@Chris簡單地說,「哈希和鹽漬」不足以用於密碼驗證程序。相反,用隨機鹽迭代HMAC約100ms持續時間,然後用散列表保存鹽。更好的是使用諸如'PBKDF2','Rfc2898DeriveBytes','password_hash','Bcrypt','passlib.hash'或類似函數的函數。關鍵是要讓攻擊者花費大量時間通過暴力破解密碼。 – zaph

回答

0

因爲您已經要求關注如何處理文本文件中的更新,所以我專注於您的問題的這一部分。所以,實際上我已經專注於回答在這些更改影響文本文件的長度和結構時如何改變文本文件中的某些內容。這個問題與文本文件中的密碼無關。 您是否應該存儲密碼,或者是否應該存儲一些可用於驗證密碼的數量等問題都存在很大的問題。所有這一切取決於你想要做什麼,你的安全模型是什麼,以及你的程序需要與什麼交互。您已經通過要求我們專注於問題的文本文件更新部分來排除您的問題的範圍。

你可能會採用以下方式來完成這項任務:

  • 剛開始看文本文件是否存在。閱讀它,如果是這樣,假設你正在做一個更新,而不是一個新的用戶

  • 要求輸入用戶名和密碼。如果它是帶有舊值的更新提示,並允許它們更改,請將其寫入文本文件。

  • 寫出文本文件。

更新存儲在文本文件中的東西的大多數策略都涉及在每次更新時完全重寫文本文件。

-2

這是一個單用戶應用程序,你有嗎?如果你能在那裏你掙扎

提供更多的信息,一個可以讀取密碼文件(其用戶名和密碼) - 當用戶進行身份驗證,匹配到文本文件 組合中的用戶名和密碼 - 當用戶想要更改密碼,然後用戶提供新舊密碼。用戶名和舊密碼組合與文本文件中的組合進行比較,如果匹配,則存儲新的

-2

嘗試使用JSON。 一個JSON文件的一個例子是這樣的:

{ 
    "Usernames": { 
     "Username": [ 
      { 
       "Password": "Password123" 
      } 
     ] 
    } 
} 

然後編輯JSON:

jsonloads = json.loads(open('json.json').read()) #Load the json 

username = input("Enter your username: ") #Get username as a string 
for i in jsonloads["Usernames"]: #Iterate through usernames 
    if i == username: #If the username is what they entered 
     passw = input("New password: ") #Ask for new password 
     jsonloads["Usernames"][i][0]["Password"] = passw #Set the password 
     jsonFile = open("json.json", "w+") #Open the json 
     jsonFile.write(json.dumps(jsonloads, indent=4)) #Write 
     jsonFile.close() #Close it 
     break #Break out of the for loop 
else: #If it remains unbroken 
    print("You aren't in the database. ") 
    user = input("Username: ") #Ask for username 
    passw = input("Password: ") #Ask for password for username 
    item = {"Password":pass} #Make a dict 
    jsonloads["Usernames"].update({user: item}) #Add that dict to "Usernames" 
    with open('json.json','w') as f: #Open the json 
     f.write(json.dumps(jsonloads, indent=4)) #Write 

類似的東西應該工作,沒有雖然進行了測試。

此外,請記住始終加密密碼!

+1

不要加密密碼,保存密碼驗證程序,查看答案評論以@Chris fr的詳細信息。但是您的示例代碼不會保存純文本密碼! – zaph

+0

另外,請勿使用名爲'pass'的變量。 ['pass'是Python中的關鍵字](https://docs.python.org/3.7/reference/lexical_analysis.html#id8)。 – Chris

0
import getpass 
import os 
import bcrypt 

new=None 

def two_hash(): 

master_key = getpass.getpass('enter pass word ') 

salt = bcrypt.gensalt() 

combo = salt + master_key 

hashed = bcrypt.hashpw(combo , salt) 

allow = raw_input('do you want to update pass ') 


if allow == 'y': 

    new = getpass.getpass('enter old pass word ') 

    combo = salt + new 

    bcrypt.hashpw(combo , salt) 

    if (bcrypt.hashpw(combo , salt) == hashed): 

    new = getpass.getpass('enter new pass ') 

    print new 


else : 
    pass 


if __name__ == '__main__': 
two_hash() 

注1:我想我的代碼拆分爲一些功能,但我不能這樣幫助分裂它的一些功能

+0

@Chris檢查這我也想分開這段代碼的一部分,但我不能做到這一點,因爲(鹽)將改變任何功能,我想將它保存到文件可以更新我的代碼,並幫助我提高它 –

+0

這根本不回答問題:它側重於密碼管理而不是與文本文件交互。 –

+0

@Sam Hartman好吧,我們不能也不應該使用任何不安全的文本文件!正如克里斯說文本不安全,我們必須以安全的方式存儲密碼 –