Шифровать пароль в python

Хеширование паролей в Python: туториал по Bcrypt с примерами

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

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

Могу ли я хранить пароли в виде простого текста?

Чтобы продемонстрировать потенциальную опасность, давайте предположим, что мы не хэшируем пароли на примере фейкового веб-сайта LoveMatchingToday. Скорее всего, когда хакер или недовольный сотрудник получает доступ к базе данных LoveMatchingToday, они загружают все имена пользователей и пароли:

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

Наилучшее решение — хеширование

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

  • user.one@gmail.com – cab864878af008fbc550087940ffacdb79a7f82201725e3350e25d6cfbdd4255
  • user.two@hotmail.com – 42a7fd2b639d18b3aba5db8504d4530f1f1ab58ab9615414b7629d6ec5c157b8

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

В Python существует библиотека Bcrypt, которая является функцией получения сильных ключей, которую можно использовать в производственных системах:

import bcrypt bcrypt.hashpw('userPlainTextPassword'.encode(), bcrypt.gensalt())

Радужные таблицы и соли

В приведенном выше фрагменте кода, вы могли задаться вопросом, что делает функция gensalt(). Если бы мы хешировали пароли без солей, злоумышленник мог бы провести атаку с помощью радужной таблицы, чтобы найти исходный текст.

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

Например, допустим, что LoveMatchingToday обновился и начал хешировать пароли, но не содержал уникальных солей. Злоумышленник может иметь предварительно вычисленную таблицу хэшей:

  • aab864878af008fbc550087940ffacdb79a7f82201725e3350e25d6cfbdd425f = password123
  • afg3683232297323f2f0087940ffacdb79a7f8284723732350e25d6cfbdd4cccc = shadowTheHedgehog1234
Читайте также:  Certification questions of java

Затем он может проверить каждый найденный хэш и посмотреть, совпадает ли хэш с записью в его таблице. Если это так, он может эффективно «развернуть» хэш и получить оригинальный текст.

По этой причине нам нужно «посолить» пароли. К счастью, Bcrypt обрабатывает засолку автоматически. Однако, ради обучения давайте предположим, что этого не случилось. Если бы такого не произошло, наш псевдокод выглядел бы примерно так:

# Save new password salt = creatRandomSalt() hashedPassword = hash(newPassword.concat(salt)) database.save(hashedPassword, salt) # Check password hashedPassword, salt = database.GetUserCredentals() passwordInput = userInput if hash(passwordInput.concat(salt)) == hashedPassword: login() else: failure()

Однако, поскольку Bcrypt автоматически сохраняет соль с хэшированным результатом в формате «», мы можем просто использовать следующий код:

import bcrypt # password = userInput hashAndSalt = bcrypt.hashpw(password.encode(), bcrypt.gensalt()) # save "hashAndSalt" in data base # To check: # password = userInput valid = bcrypt.checkpw(password.encode(), hashAndSalt)

Источник

Как хешировать пароли в Python

hashlib сохранения пароля

В данном руководстве будет разобрано использование PBKDF2_HMAC для шифрования паролей вместе с солью в Python.

Зачем нужно хешировать пароли?

Во время аутентификации пользователей и прочего с помощью паролей никогда не сохраняйте пароль в виде открытого текста (plaintext). Если злоумышленник найдет базу данных паролей в незашифрованном виде, их можно легко использовать в сочетании с соответствующими адресами электронной почты для входа на сайт/аккаунт и даже использовать для попытки входа на другие аккаунты, поскольку многие люди часто используют один и тот же пароль везде.

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

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Почему не стоит использовать SHA-256 или нечто похожее

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

Читайте также:  Typescript react пример приложения

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

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

Хеширование паролей с pbkdf2_hmac

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

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

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

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

PBKDF2_HMAC является реализацией функции получения ключа PBKDF2, использующей HMAC в качестве псевдослучайной функции. pbkdf2_hmac можно найти в библиотеке hashlib (которая поставляется с Python) и находится в Python 3.4 и выше. pbkdf2_hmac принимает пять параметров:

  • hash_name : алгоритм хеш дайджеста для HMAC;
  • password : пароль, превращенный в ключ;
  • salt : случайно сгенерированная соль;
  • iterations : итерации в вычислении (чем больше, тем длиннее вычисления);
  • dklen : длина ключа вывода (не обязательно).
Читайте также:  File input operation java

Генерация соли в Python

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

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

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

Источник

Шифрование и криптография в Python

В Python не так уж много инструментов стандартной библиотеки, которые работают с шифрованием. Однако, в нашем распоряжении есть библиотеки хешинга. Давайте рассмотрим этот вопрос в данной статье, но более детально сфокусируемся на двух сторонних пакетах: PyCrypto и cryptography. Мы научимся шифровать и расшифровывать строки при помощи двух этих библиотек.

Хеширование

Если вам нужно защитить хэши или алгоритм дайджеста сообщений, то для этого прекрасно подойдет модуль стандартной библиотеки Python hashlib. Он включает в себя безопасные алгоритмы хеширования FIPS, такие как SHA1, SHA224, SHA256, SHA384, а также SHA512 и MD5. Python также поддерживает функции хеширования adler32 и crc32, но они содержатся в модуле zlib. Одно из самых популярны применений хеширования это хранение хеша пароля, вместо самого пароля. Конечно, хеш должен быть хорошим, в противном случае он может быть расшифрован.

Другой популярный случай, в котором применяется хеширование – это хеширование файла, с последующей отправкой файла и его хеша по отдельности. Получатель файла может запустить хеш в файле, чтобы убедиться в том, что файл соответствует отправленному хешу. Если это так, значит никто не менял файл, когда он был отправлен. Давайте попробуем создать хеш md5. Но оказывается, чтобы использовать хеш md5, нужно передать его строке байта, вместо обычной. Так что мы попробовали сделать это, после чего вызвали метод дайджеста, чтобы получить наш хеш. Если вы претпочитаете хешированный дайджест, мы можем сделать и это:

Источник

Оцените статью