Механизм bcrypt в аутентификации (без совпадения хэшей) - PullRequest
0 голосов
/ 08 декабря 2011

Я пытаюсь реализовать метод входа в систему для mongodb, используя python (pymongo) и bcrypt.проблема возникает, когда я пытаюсь сравнить хэши, они всегда разные: $.

Это мой тестовый код (прежде всего я ввел в 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).Так что я немного запутался.

Спасибо за чтение. Любая помощь с тем, что не так в моей реализации аутентификации?

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

И да, я уверен, что БД дает мне правильные поля.

1 Ответ

2 голосов
/ 08 декабря 2011

Для проверки пароля вам нужно передать сам хеш как соль, так как он содержит соль как префикс . Это немного сбивает с толку, но так как вам абсолютно необходимо использовать ту же соль, чтобы получить тот же хеш, что и раньше, это единственный способ:

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

(но я просто скопировал и вставил)

...