0

我正在尝试使用 python (pymongo) 和 bcrypt 为 mongodb 实现登录方法。当我尝试比较哈希时,问题就来了,它们总是不同的:$。

这是我的测试代码(首先我把一个密码散列的用户放入 mongodb):

使用蟒蛇 scrypt :

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


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

一旦我们将它放入数据库中,我正在尝试创造魔法: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 回答