2012-08-02 6 views
1

Использование: Python 3.2.3, 0.5.5 Scrypt модуль, Ubuntu 12.04Python 3, Scrypt модуль, хэши не Matching

Я установил модуль Scrypt штраф. Я правильно выполнил код примера на странице. Я также нашел expanded version of the sample code, что тоже отлично. Но я хотел проверить, будет ли он иметь одно и то же слово дважды, поэтому я добавил секционный вызов Encrypt(), чтобы имитировать концепцию хэширования его один раз для БД, а затем снова хешировать, когда пользователь входит в систему, поэтому мой полный код выглядит так:

import random,scrypt 

class Encrypt(object): 

    def __init__(self): 
     pass 

    def randSTR(self,length): 
     return ''.join(chr(random.randint(0,255)) for i in range(length)) 

    def hashPWD(self,pwd, maxtime=0.5, datalength=64): 
     return scrypt.encrypt(self.randSTR(datalength), pwd, maxtime=maxtime) 

    def verifyPWD(self,hashed_password, guessed_password, maxtime=0.5): 
     try: 
      scrypt.decrypt(hashed_password, guessed_password, maxtime) 
      return True 
     except scrypt.error: 
      return False 

if __name__ == '__main__': 
    e = Encrypt() 
    user_pw = 'theansweris42' 
    user_salt = 't9' 
    pw_salt = user_pw + user_salt 
    hashed_pw = e.hashPWD(pw_salt) # To be stored len()==192 
    y = e.verifyPWD(hashed_pw, pw_salt)    # True 
    n = e.verifyPWD(hashed_pw, 'guessing'+ pw_salt) # False 
    print(y) 
    print(n) 
    #print("Hash: %s" % (hashed_pw)) 

    x = Encrypt() 
    user_pw2 = 'theansweris42' 
    user_salt2 = 't9' 
    pw_salt2 = user_pw2 + user_salt2 
    hashed_pw2 = x.hashPWD(pw_salt2) # To be stored len()==192 
    y2 = x.verifyPWD(hashed_pw, hashed_pw2)    # True 
    print(y2) 
    print(pw_salt) 
    print(pw_salt2) 
    print(hashed_pw) 
    print(hashed_pw2) 

... как вы можете видеть, я также жестко закодировал соль (для тестирования). Как ни странно, каждый раз, когда я запускаю это, hashed_pw & hashed_pw2 всегда разные. Почему этот хэширование одного и того же пароля по-разному каждый раз? Разве он не должен выводить один и тот же хеш каждый раз, когда я даю ему тот же самый вход? Я пытался понять это в течение часа, поэтому я думаю, что лучше спросить.

ответ

0

Вы шифруете две разные случайные строки с одинаковым паролем (плюс соль). Это приведет к двум различным выходам.

Используемый здесь трюк состоит в том, что пароль + соль может использоваться для дешифрования этой случайной строки, а неправильный пароль вызывает ошибку. Следовательно, вам не нужно хранить исходную случайную строку, чтобы убедиться, что пароль правильный, и поскольку используемая строка была случайной (в пределах генератора случайных чисел), будет очень сложно взломать пароль.

+0

Я думаю, что я что-то не понимаю. Я немного новичок в этом, поэтому прошу прощения, если я прошу что-то «глупо», но ... Как я шифрую две разные случайные строки? Разве это не хеширование строки 'theansweris42t9' оба раза? Эта строка является значением как 'pw_salt', так и' pw_salt2', поэтому, когда я их использую, он должен выводить одно и то же значение, правильно? – Zamphatta

+0

Кроме того, я должен хранить что-то (хеширование pwd & salt?) В БД, чтобы сравнить его позже, когда пользователь входит в систему, верно? – Zamphatta

+0

@ Zamphatta: Нет, строка, которую вы шифруете, - self.randSTR (datalength). И да, вам нужно хранить хэш и соль. Но вы ничего не сравниваете, вы просто расшифровываете сохраненный хэш с паролем и солью. –