2016-07-11 5 views
1

AI-like chatbotを作成しようとしていますが、その機能の1つがログインです。以前はログインコードを使用していましたが、うまくいきましたが、パスワードのハッシュを処理するコードで問題が発生しました。ここでは、コードです:なぜPythonでハッシュする前にエンコードを宣言する必要がありますか?どのようにすればいいですか?

import hashlib 
... 
register = input ("Are you a new user? (y/n) >") 

password_file = 'passwords.txt' 
if register.lower() == "y": 
    newusername = input ("What do you want your username to be? >") 
    newpassword = input ("What do you want your password to be? >") 

    newpassword = hashlib.sha224(newpassword).hexdigest() 

    file = open(password_file, "a") 
    file.write("%s,%s\n" % (newusername, newpassword)) 
    file.close() 

elif register.lower() == ("n"): 
    username = input ("What is your username? >") 
    password = input ("What is your password? >") 

    password = hashlib.sha224(password).hexdigest() 

    print ("Loading...") 
    with open(password_file) as f: 
     for line in f: 
      real_username, real_password = line.strip('\n').split(',') 
      if username == real_username and password == real_password: 
       success = True 
       print ("Login successful!") 
       #Put stuff here! KKC 
    if not success: 
     print("Incorrect login details.") 

そして、ここで私が得ていた結果だ:私は私が(ラテン1)を使用してされるべきだと思うのエンコーディングを見て、必要な構文を発見した

Traceback (most recent call last): 
    File "<FOLDERSYSTEM>/main.py", line 36, in <module> 
    newpassword = hashlib.sha224(newpassword).hexdigest() 
TypeError: Unicode-objects must be encoded before hashing 

、と私はまだ同じ結果を受け取ることを追加しました。

答えて

1

ハッシングはバイトで動作します。 strオブジェクトにはバイトではなくUnicodeテキストが含まれているため、最初にエンコードする必要があります。 a)遭遇する可能性のあるすべてのコードポイントを処理できるエンコーディングを選択し、おそらく同じハッシュを生成する他のシステムも使用するエンコーディングを選択します。

ハッシュの唯一のユーザーであれば、UTF-8を選択してください。それは、Unicodeのすべてを処理し、西洋のテキストのための最も効率的であることができます:あなたがあなたのファイルから読み込まstr値とその比較しても安全なようhash.hexdigest()から

newpassword = hashlib.sha224(newpassword.encode('utf8')).hexdigest() 

戻り値は、Unicodeのstr値です。

+0

ありがとうございますが、「ハッシュの唯一のユーザー」とはどういう意味ですか?これはGitHubプロジェクトなので、それでも動作しますか?また、私はこれを試して、登録は正常ですが、ログインしようとすると 'Traceback(直近の最後のコール): ファイル"/home/pi/Desktop/KittyKatCoder-edison-ai-3ae75b2/ real_username、real_password = line.strip( '\ n')。split( '、') ValueError:解凍するには1以上の値が必要です。 – KittyKatCoder

+0

@KittyKatCoder:あなたが共有していると言っていますこれらのパスワードは別のシステムとハッシュします。そのシステムでUTF-16を使用してUnicodeテキストをバイトにエンコードする場合、そのエンコーディングと一致する必要があります。私はほとんどのシステムがUTF-8を使うことを賭けるだろう。 –

+0

よろしくお願いいたします。エラーについて私は何ができますか? – KittyKatCoder

関連する問題