2011-12-08 11 views
0

私はpython(pymongo)とbcryptを使ってmongodbのログインメソッドを実装しようとしています。問題は、私がハッシュを比較しようとするときに来る、彼らはいつも異なっている:$。authのbcryptメカニズム(マッチハッシュなし)

これは私のテストコード(私はハッシュ化されたパスワードを使用して、MongoDBのユーザーに入れまず第一)である:、私たちは、DBに入れたら

bcrypt.hashpw('testpassword', bcrypt.gensalt(12)) 
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi' 


db.users.insert({username: "yichuan",password: "$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi" }); 

ニシキヘビscryptを使用してD::」魔法をしようとしてmは

def test_connectionManagerLoginPass(self): 
    connectionmanager=dbconnection.ConnectionManager() 
    username='yichuan' 
    password='testpassword' 
    hashed = bcrypt.hashpw(password, bcrypt.gensalt(12)) 
    self.assertIsNotNone(connectionmanager.login(username,hashed), 'No error espected in login') 

が、私は値をハッシュ化された見たときに問題が来る:

'$2a$12$hw1DaWdOf3ECBcSgu2GB4Of3oAdKvyzl0xftBVzbyqkjK2A3X.LOm' 

私は以前に生成したものと全く異なります!!!。また、私は を読んでいて、bcrypt.gensalt(12)を保存する必要はありませんでした。だから少し混乱している。

読んでいただきありがとうございます、私の認証の実装で何が間違っていますか?

POSDATA(もっとコード)

def login(self,username,password): 
    if self.loginfieldsfilter(username,password): 
     dbdata = self.users.find_one({'username': username}) 
     if password == dbdata[ 'password' ]: 
      return True 
     else: 
      return None 
    else: 
     return None 

そして、はい、私はデシベルは私に正しいフィールドを与えていることを確信しています。

答えて

2

パスワードチェックでは、塩分がプレフィックスであるため、ハッシュ自体を塩として渡す必要があります。これは少し紛らわしいですが、あなたは絶対にそれが唯一の方法だ、前と同じハッシュを取得するために同じ塩を使用しなければならないので:

>>> myhash = bcrypt.hashpw('testpassword', bcrypt.gensalt(12)) 
>>> myhash  
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi' 
>>> bcrypt.hashpw('testpassword', myhash) 
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi' 

(しかし、私はちょうどコピー&ペーストで一緒にこれを置く)

+0

今私は理解しているが、ログインのために、私は問題がある。クライアントがde bcrypt関数を作成し、ハッシュを送信してサーバーで比較する必要があります。私はすべての接続のための魚の塩を入れればそれは大丈夫だろうか? –

+0

クライアントからハッシュが送信され、データベースのパスワードと比較する必要がありますか?問題がなければ、 'bcrypt.hashpw() 'を計算して、クライアントが送ったのと同じハッシュになったかどうかを調べてください。 –

+0

ああ、待って...あなたのデータベースに平文のPwはありませんよね? –