身份验证中的bcrypt机制(无匹配哈希)

时间:2011-12-08 10:59:34

标签: python mongodb bcrypt

我正在尝试使用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" });

一旦我们把它放入数据库,我就试图制造魔法: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)。所以我有点困惑。

感谢您的阅读,我在执行auth时出现的问题有什么帮助吗?

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

是的,我确信db正在给我正确的字段。

1 个答案:

答案 0 :(得分:2)

对于密码检查,您需要将哈希本身作为salt传递,因为它包含salt作为前缀。这有点令人困惑,但由于你绝对必须使用相同的盐来获得与以前相同的哈希值,这是唯一的方法:

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

(但我只是通过复制和粘贴将它们放在一起)