0

Python(pymongo)とbcryptを使用して、mongodbのログインメソッドを実装しようとしています。問題は、ハッシュを比較しようとすると発生します。ハッシュは常に異なります:$。

これは私のテストコードです(まず、パスワードをハッシュしたユーザーをmongodbに入れます):

pythons scryptの使用:

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


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

それをdbに入れたら、魔法を作ろうとしています:D:

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

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

4

1 に答える 1

2

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

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

(ただし、これをコピー&ペーストでまとめただけです)

于 2011-12-08T11:14:39.283 に答える