我正在尝试使用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正在给我正确的字段。
答案 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'
(但我只是通过复制和粘贴将它们放在一起)