2017-09-17 15 views
0

私は、この例ではユーザ名とパスワードを言うように要求するプログラムを作成しようとしていますが、これを保存します(私はテキストファイルにします)。私が苦労している分野は、テキストファイルに保存されているパスワードをユーザが更新できるようにする方法です。私はこれをPythonで書いています。ユーザー名とパスワードを保存し、ユーザーの更新を許可します。 Python

+3

いくつかの機能に分割のためにそれを助けることができませんパスワードはプレーンテキストである必要があります._あなたが書き込んだコードではなく、ハッシュして塩漬けする必要があります。利用可能な認証ライブラリはたくさんあります。とにかく、データベースをデータベースとして使用すると、苦労することはありません。データの追加、データの参照、データの変更、データの削除を簡単に行うことができます。 SQLiteはPythonに含まれており、使い方はかなり簡単です。 – Chris

+0

Pythonに含まれている別の「データベース」は、[shelve](https://docs.python.org/3.6/library/shelve.html)です。これはSQLiteよりも簡単です。 –

+2

@Chrisパスワードバリデーターとしては、単に「ハッシュと塩漬け」が不十分です。代わりに、約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 'PBKDF2'、' Rfc2898DeriveBytes'、 'password_hash'、' Bcrypt'、 'passlib.hash'などの関数を使うのが良いです。要点は、攻撃者が無差別にパスワードを見つけるのにかなりの時間を費やすようにすることです。 – zaph

答えて

0

更新プログラムをテキストファイルで処理する方法に焦点を当てるように依頼したので、私は質問のその部分に焦点を合わせました。したがって、実際には、テキストファイルの長さと構造に影響を与える変更がテキストファイルでどのように変化するかについて、どのように回答するかに焦点を当てました。その質問は、パスワードであるテキストファイル内のものとは無関係です。 パスワードを保存する必要があるかどうか、またはパスワードを確認するために使用できる数量を保存する必要があるかどうかに関する重要な懸念事項があります。それは、あなたがしようとしていること、あなたのセキュリティモデルが何であるか、そしてあなたのプログラムが何をやりとりする必要があるかによって決まります。あなたは、問題のテキストファイルの更新部分に焦点を当てるように質問することで、問題の範囲外のすべてを支配しました。

あなたは、このタスクを達成するために、次のパターンを採用するかもしれません:テキストファイルが存在する場合、初めに

  • を参照してください。それを読んで、そうであれば新しいユーザーではなく更新をしていると仮定してください。

  • ユーザー名とパスワードを尋ねます。古い値の更新プロンプトで変更を許可する場合

  • テキストファイルを書き出します。

テキストファイルに格納されたものを更新するためのほとんどの戦略には、すべての更新時にテキストファイルを完全に書き換える必要があります。

-2

これは単一のユーザーアプリケーションですか?あなたは

を苦労している場所あなたがより多くの情報1を提供することができた場合は、(ユーザー名とパスワードを持っている)、パスワード・ファイルを読み込むことができ - ユーザー認証は、テキストファイル での組み合わせにユーザー名とパスワードが一致した場合 - 場合には、ユーザーパスワードを変更したい場合、ユーザーは古いパスワードと新しいパスワードを入力します。ユーザー名と古いパスワードの組み合わせをテキストファイルのものと比較し、一致する場合は新しいものを保存します。

-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チェックこのコードの一部を分離したいのですが、(塩)がどの関数でも変更され、ファイルに保存したいので、コードを更新して改善することができますit –

+0

これは全く質問に答えるものではありません。テキストファイルと対話するのではなく、パスワード管理に重点を置いています。 –

+0

@Sam Hartman [OK]を私たちはすることはできませんし、安全ではないテキストファイルで作業する必要はありません!クリスはテキストが安全ではないと言っており、安全な方法でパスワードを保管しなければならないのと同じように –

関連する問題