Flask -шифрованный га sh результат не такой, как ожидалось - PullRequest
0 голосов
/ 29 февраля 2020

Я должен принять меры безопасности для проекта курса, который я прохожу, и я столкнулся с чем-то, чего я не ожидал.

Прежде всего, я сохранил пароль:

########################## Password hashing ############################
        # 1. Generate salt
        salt = os.urandom(32)
        salt = (binascii.hexlify(salt)).decode('utf-8')

        # 2. Append salt to the password
        password = data['password']
        password = password + salt
        # 3. Hash the password and storing
        password = bcrypt.generate_password_hash(password).decode('utf-8')
        output_msg = database_helper.save_new_user(data['email'], password, data['firstname'], data['familyname'], data['gender'], data['city'], data['country'], salt)

        ######################################################################## 

Это данные, которые сохраняются в базе данных:

salt2@salt.com|$2b$12$WJx.XLYk/8Zx4HdDnPqxK.0RiZ6QR8rQEpZrw7jBpJRFUZ2sfBWyW|salt2|sal|male|link |swe|b5e333e0bae505d4fae6d9b993bcdcfd6964e480ce4dc1b5fd6b13c034d23bb8

Для проверки пароля я делаю следующее:

########################### Password validation ############################
# 1. Retrive user's salt from the database
authentication_data = database_helper.get_users_salt(email)

# 2. Append salt to the inputed password and hash it
inputed_password = inputed_password + authentication_data['salt']
inputed_password = bcrypt.generate_password_hash(inputed_password).decode('utf-8')


# 3. Compare the hash generated from the inputed password with the one in
#    the database
boolean_success = database_helper.check_user_password(email, inputed_password)

############################################################################

И получая соль из базы данных покажите в результате это, что я и сохранил:

b5e333e0bae505d4fae6d9b993bcdcfd6964e480ce4dc1b5fd6b13c034d23bb8

И хэширование inputed_password с солью показывает в результате это:

$2b$12$yEE.OX5IFyIXTK4x3XOBbO4Ospm2hcCz9FCmjzEn3tC5DNg9crtxy

В двух словах, почему показываются разные результаты хеширования?

1 Ответ

0 голосов
/ 29 февраля 2020

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

Создать:

# password entered by user
hashed = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
hashed_str = hashed.decode('ascii')
# store out hashed_str for user

Проверить:

# retrieve hashed_str for user
# password entered by user
valid =  bcrypt.checkpw(password.encode('utf-8'), hashed_str.encode('ascii'))

Примечание

bcrypt обрабатывает только пароли длиной до 72 байт, любые дополнительные символы игнорируются. Поэтому, если вы разрешите пароли, которые могут кодироваться длиной более 72 байтов, вы можете использовать следующий код:

Создать:

# password entered by user
password_bytes = password.encode('utf-8')
if len(password_bytes) > 72:
    password_bytes = base64.b64encode(hashlib.sha256(password_bytes).digest())
hashed = bcrypt.hashpw(password_bytes, bcrypt.gensalt())
hashed_str = hashed.decode('ascii')
# store out hashed_str for user

Проверить :

# retrieve hashed_str for user from database
# password entered by user
password_bytes = password.encode('utf-8')
if len(password_bytes) > 72:
    password_bytes = base64.b64encode(hashlib.sha256(password_bytes).digest())
valid =  bcrypt.checkpw(password_bytes, hashed_str.encode('ascii'))
...