2017-09-17 129 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好吧,我们不能也不应该使用任何不安全的文本文件!正如克里斯说文本不安全,我们必须以安全的方式存储密码 –