2017-11-28 6 views
0

私はこのスクリプトを持っています。これはユーザーをmongoデータベースに追加するための一時的な方法です。ハッシュパスワードはBSON形式で格納されていますBinData Type

操作は正常に実行されますが、パスワード用に生成されたハッシュはBSON Binary Data (a.k.a BinData)として保存されています。

#!/usr/bin/python3 

import bcrypt 
from getpass import getpass 
from pymongo import MongoClient 

def connect(): 
    db_user = "mongo" 
    db_pass = "mongo" 
    db_addr = "127.0.0.1:27017" 
    uri = "mongodb://{0}:{1}@{2}".format(db_user,db_pass,db_addr) 
    client = MongoClient(uri,serverSelectionTimeoutMS=6000) 
    return client 

try: 
    user_data = {} 
    user_data["Name"]  = input("Full Name: ") 
    user_data["Sector"] = input("Sector:  ") 
    user_data["Email"] = input("Email:  ") 
    user_data["Username"] = input("Username: ") 
    password = getpass(prompt="Password: ").encode('utf-8') 
    salt = bcrypt.gensalt() 
    pass_hash = bcrypt.hashpw(password, salt) 
    user_data["Password"] = pass_hash 
    client = connect() 
    db = client.companydb 
    collection = db.Authentication 
    result = collection.insert_one(user_data) 
    print("Done!") 
except Exception as e: 
    print("Exception:",e) 

MongoDBの

> db.Authentication.find().pretty() 
{ 
    "_id" : ObjectId("5a1d9cf8e6023f20d3b11bf3"), 
    "Name" : "My Full Name", 
    "Password" : BinData(0,"JDJiJDEyJDR0RzFwRkNjaE1HdlExd0kuRXgyLk91U09yQWZYTWxZL2pZbUVod3N2NGhRR05XUXIyNDRh"), 
    "Username" : "ivanleoncz", 
    "Email" : "[email protected]", 
    "Sector" : "IT" 
} 

私は理解したいと思います:

  • ハッシュされたパスワードがBSON BINDATAとして格納されているのはなぜ?
  • このような状況を避けることはできますか?それが可能なら、どうですか? dictの直接Xinsert_one({"Username":var_name,"Password":var_hash})を格納

  • の間に違いはありますか?ハッシュされたパスワードがBSON BINDATAとして格納されているのはなぜ

+1

パスワードベリファイアをバイナリ形式で保存するのが嫌なのはなぜですか? ' "$ 2B $ 12 $ 4tG1pFCchMGvQ1wI.Ex2.OuSOrAfXMlY/jYmEhwsv4hQGNWQr244a"': 'Futher "JDJiJDEyJDR0RzFwRkNjaE1HdlExd0kuRXgyLk91U09yQWZYTWxZL2pZbUVod3N2NGhRR05XUXIyNDRhは、"' Base64では、ACSIIテキストではなく、バイナリ、エンコードされたASCIIにエンコードされています。 – zaph

+0

私は嫌いではないと私はこれを言及していない。しかし、そのような形式でパスワードハッシュを持つ必要がありますか?私はそれがパスワードのハッシュを持っているが、私はBinData形式が大丈夫である理由を理解するために開いている、例えば、です。 – ivanleoncz

+0

あなたはこのコメントを答えに凝縮することができますか(アイデアをフォーマットする)? – ivanleoncz

答えて

1

bcrypt.hashpw()bytesデータ型を返すためです。例えば:PyMongo(Pythonの3)でも

b'$2b$12$bvjnkItDoYvw.GUwBeVuwOuIxIQ5hUIx.ECovNrnYc1kgSP/kruXu' 

bson.binary.Binary()およびその逆に符号化されるバイト。

このような状況を避けることはできますか?それが可能なら、どうですか?

MongoDBの文字列にハッシュを格納する場合は、辞書に格納するときにハッシュをデコードすることができます。すなわち

user_data["Password"] = pass_hash.decode("utf-8") 

# When checking later you would have to encode it back to bytes. 
bcrypt.checkpw(b"mysecretpassword", user_data["Password"].encode("utf-8")) 

コメントで述べたように(ご使用の場合は、それを必要としない限り)、単にパスワードを保存し、後で認証するためのパスワードを回復に関しては、あなただけのバイナリとしてそれを維持することができます

この文書がMongoDBから取り戻されたときに、Python 3のbson.Binaryのインスタンスはバイトに直接デコードされるからです。あなたが間に違いありfind()

を使用して戻って文書を検索することで、これをテストすることができます:あなたは答えから見ることができるようにinsert_one

対直接辞書を保存するが、これはbcrypt.hashpw()の組み合わせでの動作ですおよびinsert_one()

+0

私はいくつかのテストをしていましたが、実際にはバイナリが直接バイトにデコードされることに気付きました。大変ありがとうございます。非常に完全な答え:)!よろしく。 – ivanleoncz

関連する問題