Хэширование пароля

Feb 08 2023
Поверхность атаки паролей
Некоторые из наиболее разрушительных кибератак возникают из-за нарушения паролей, которые плохо хранятся в базах данных на стороне сервера. Проблема может начаться с пользователя, который может быть склонен устанавливать простой и запоминающийся пароль.
Фото Майкла Дзидзича на Unsplash

Некоторые из наиболее разрушительных кибератак возникают из-за нарушения паролей, которые плохо хранятся в базах данных на стороне сервера.

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

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

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

Не бойтесь, эти нервные перспективы могут быть ограничены так называемым хешированием паролей!

Фото Маркуса Списке на Unsplash

Определение хеширования

Хеширование паролей — это метод криптографического алгоритма, который берет открытый текст, запускает сложную хеш-функцию и создает хешированный текст. Ключом к этому процессу является функция, но не все одинаково подходят для предотвращения растрескивания.

Все функции должны удовлетворять двум ключевым свойствам, чтобы соответствовать критериям OWASP (Проект безопасности веб-приложений с открытым исходным кодом):

Трудно создать начальный ввод, который соответствовал бы конкретному желаемому результату.

Чтобы проиллюстрировать эту характеристику, хеш «Пароль», сгенерированный с помощью популярного криптографического алгоритма sha256, выглядит следующим образом:

e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a

И хэш «пароль»:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

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

Практично создать хэш, но практически невозможно повторно сгенерировать ввод, если известно только значение хеш-функции.

В отличие от шифрования, при котором обычный текстовый пароль преобразуется в зашифрованный текст, прежде чем расшифровываться обратно в обычный текст, хеширование — это одна из функций. Поскольку хэширование паролей является детерминированным, один и тот же ввод всегда дает один и тот же вывод.

Вариант использования этого — когда пользователь создает пароль, его можно хэшировать, а результат сохраняется в базе данных. Когда пользователь снова пытается ввести свой пароль, он снова хэшируется, а затем сверяется с хешем в базе данных. Если злоумышленник получает доступ к базе данных хэшей, это практически бесполезно, поскольку пароли нельзя преобразовать обратно в открытый текст.

Попробуйте запустить этот скрипт Python, чтобы увидеть простую версию этой концепции :

# this and other fun scripts can be found at: https://github.com/Jay-Gokani

# install sha256 library for hashing
from hashlib import sha256

# demo explanation
print ('Hello, this demo will ask for a plaintext password, hash it and will verify the hash for access requests')

# first hash stored as a variable
hash1 = (sha256(input('What phony password would you like to set? ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash1)

# password hash stored confirmation
print ('Your password hash has been successfully stored.')

# promt the user for password re-entry, hash and store as another variable
hash2 = (sha256(input('I will test your hash. Please type your password: ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash2)

# access approval or deny check
while True:
    if hash1 == hash2:
        print('Success - password hash matches.')
        break
    else:
        print('The password hash does not match. Please run the programme again.')
        break

Хэши, конечно, не являются универсальным решением для предотвращения взлома паролей. Например, злоумышленники могут создавать списки общих паролей и соответствующих им хэшей. Если какие-либо хэши в базе данных есть в списке, злоумышленник узнает открытый текстовый пароль. Но это не должно быть проблемой, если незашифрованные пароли создаются с достаточной сложностью. Кроме того, приложение, которое принимает пароли в виде открытого текста для создания хэшей, может быть перехвачено.

Хеширование паролей — отличный шаг в правильном направлении! Надеемся, вам понравилась эта статья :-)