Использование: 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 всегда разные. Почему этот хэширование одного и того же пароля по-разному каждый раз? Разве он не должен выводить один и тот же хеш каждый раз, когда я даю ему тот же самый вход? Я пытался понять это в течение часа, поэтому я думаю, что лучше спросить.
Я думаю, что я что-то не понимаю. Я немного новичок в этом, поэтому прошу прощения, если я прошу что-то «глупо», но ... Как я шифрую две разные случайные строки? Разве это не хеширование строки 'theansweris42t9' оба раза? Эта строка является значением как 'pw_salt', так и' pw_salt2', поэтому, когда я их использую, он должен выводить одно и то же значение, правильно? – Zamphatta
Кроме того, я должен хранить что-то (хеширование pwd & salt?) В БД, чтобы сравнить его позже, когда пользователь входит в систему, верно? – Zamphatta
@ Zamphatta: Нет, строка, которую вы шифруете, - self.randSTR (datalength). И да, вам нужно хранить хэш и соль. Но вы ничего не сравниваете, вы просто расшифровываете сохраненный хэш с паролем и солью. –