Как отключить конкатенацию при использовании метода обновления hashlib? - PullRequest
0 голосов
/ 06 февраля 2020

Я написал метод для хеширования паролей с помощью hashlib. Я разрешаю пользователю отправлять пароль с помощью метода POST, который принимается Flask, а затем пароль хэшируется, чтобы можно было проверить ha sh по сохраненной переменной, чтобы убедиться, что это то же самое.

Отлично работает как при отправке правильного, так и неправильного пароля в первый раз. Но если пользователь отправляет неверный пароль на первом POST, а затем пытается снова с правильным паролем, это не удается. (Можно было бы также подумать, что это не удалось, если первая попытка была успешной, а пользователь продолжает попытки, но сейчас мне все равно.)

Мне удалось сузить проблема до функции обновления hashlibs

ha sh .update (arg) Обновите объект ha sh с помощью строки arg. Повторные вызовы эквивалентны одному вызову с объединением всех аргументов: m.update (a); m.update (b) эквивалентен m.update (a + b).

Я хотел знать, как отключить объединение при повторных вызовах. Не имеет значения, если это хакерский обходной путь.

Вот мой код на случай, если он будет полезен:

h = hashlib.sha256()
VALID_USERNAME = 'admin'
VALID_PASSW_HASH = "210ce034be6d826a451a4261d70494148c5d7101627335ccacf8e00a711bcc5d"

@app.route('/api/queue/auth', methods=['POST'])
def auth():
    username = request.json.get('username')
    password = request.json.get('password')
    if bool(username) is False or bool(password) is False:
        return "\nPlease fill in both fields.\n", 400
    passwordBytes = password.encode(encoding='UTF-8',errors='strict')
    h.update(passwordBytes)
    if h.hexdigest() != VALID_PASSW_HASH or username != VALID_USERNAME:
        return "\nPlease check your username and password, and try again.\n", 401
    r.set('auth', 'true')
    return "Access Granted.\n", 200

Дополнительные примечания:

  • the "r. set "(над последней) просто потому, что позже он что-то делает с Redis.
  • я проверил, что passwordBytes всегда возвращает одну и ту же кодировку, когда предоставляется один и тот же пароль (это определено c)
  • Я также проверил, что h.hexdigest () возвращает что-то другое, если тот же пароль предоставляется с первой попытки или с другой попытки. Таким образом, принимая во внимание эти два момента, мы можем быть уверены, что проблема заключается в h.update (), возможно, из-за возможности конкатенации.

1 Ответ

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

Просто переместите первую строку из глобальной области видимости в функцию auth():

VALID_USERNAME = 'admin'
VALID_PASSW_HASH = "210ce034be6d826a451a4261d70494148c5d7101627335ccacf8e00a711bcc5d"

@app.route('/api/queue/auth', methods=['POST'])
def auth():
    username = request.json.get('username')
    password = request.json.get('password')
    if bool(username) is False or bool(password) is False:
        return "\nPlease fill in both fields.\n", 400
    passwordBytes = password.encode(encoding='UTF-8',errors='strict')
    h = hashlib.sha256()
    h.update(passwordBytes)
    if h.hexdigest() != VALID_PASSW_HASH or username != VALID_USERNAME:
        return "\nPlease check your username and password, and try again.\n", 401
    r.set('auth', 'true')
    return "Access Granted.\n", 200

или, что еще лучше, реорганизуйте хеширование пароля для другой функции:

VALID_USERNAME = 'admin'
VALID_PASSW_HASH = "210ce034be6d826a451a4261d70494148c5d7101627335ccacf8e00a711bcc5d"

def hash_password(password):
    passwordBytes = password.encode(encoding='UTF-8',errors='strict')
    h = hashlib.sha256()
    h.update(passwordBytes)
    return h.hexdigest()


@app.route('/api/queue/auth', methods=['POST'])
def auth():
    username = request.json.get('username')
    password = request.json.get('password')
    if bool(username) is False or bool(password) is False:
        return "\nPlease fill in both fields.\n", 400
    if hash_password(password) != VALID_PASSW_HASH or username != VALID_USERNAME:
        return "\nPlease check your username and password, and try again.\n", 401
    r.set('auth', 'true')
    return "Access Granted.\n", 200
...