Храните пароли пользователей в виде обычного текста?

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

Krebs on Security — Facebook хранил сотни миллионов паролей пользователей в открытом виде в течение многих лет.

RockYou2021 — крупнейший сборник паролей всех времен просочился в интернет с 8,4 миллиардами записей

Взлом SolarWinds: тайна одной из крупнейших кибератак в истории

Я считаю, что когда создается новое приложение или сайт, безопасность должна быть одной из первых вещей, которые необходимо реализовать. Я собираюсь показать вам простой способ хеширования паролей с помощью Python. Мы будем использовать SHA-2(512) для создания длинной строки из пароля.

Требования

  • Python 3.
  • Passlib
    • https://passlib.readthedocs.io/en/stable/

TLDR

Давайте писать код!

Я собираюсь написать немного кода и объяснить, что происходит. Начну с импорта двух наших библиотек Passlib и Getpass.

1 |  from passlib.handlers.sha2_crypt import sha512_crypt as hasher
2 |  from getpass import getpass
Вход в полноэкранный режим Выход из полноэкранного режима

Итак, что мы имеем?

Строка 1: Passlib импортирован, а из модуля handlers.sha2_crypt мы импортируем sha512_crypt
как хэшер.

Строка 2: Из библиотеки getpass мы импортируем getpass.

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

5 | def account_creation():
6 |     username = input("Please enter a username: ")
7 |     password = getpass("Please enter a password: ")
8 |     hashed_password = hasher.hash(password, rounds=200_000)
9 |     database_create(username, hashed_password)
Вход в полноэкранный режим Выход из полноэкранного режима

Что только что произошло?

Строка 5: мы определили нашу функцию и назвали ее account_creation()

Строка 6: запрашивает у пользователя имя пользователя и устанавливает его как переменную с именем username.

Строка 7: запрашивает у пользователя пароль и устанавливает его в переменную password.

Строка 8: хэширует наш пароль с помощью hasher.hash и устанавливает округление до 200 тысяч. По умолчанию passlib
итерирует хэш 29 000 раз, но мы пошли дальше и установили 200 тысяч!

Строка 9: мы вызываем функцию database_create() и передаем ей два параметра — имя пользователя и пароль.

Давайте создадим наше определение database_create(), через которое мы только что передали имя пользователя и пароль.

12 | def database_create(username, password):
13 |    file = open(f"{username}.txt", "w")
14 |    file.write(password)
15 |    file.close()
16 |    print("Account created.")
Вход в полноэкранный режим Выход из полноэкранного режима

Строка 12: мы определяем нашу функцию database_create() и передаем аргументы имя пользователя и пароль.

Строка 13: мы создаем переменную с именем file и присваиваем ей встроенную в Python функцию open(). Эта встроенная функция используется для открытия или создания файлов. Внутри функции open() мы передаем f-строку с аргументом
имя пользователя. Как видите, создается файл .txt с указанным именем пользователя.

Строка 14: Наш файл переменных используется для записи пароля с помощью функции write().

Строка 15: Мы используем функцию close(), чтобы убедиться, что код и ОС закрыли сессию.

Строка 16: И мы выводим что-то, чтобы подтвердить, что наш код завершен.

Наконец, мы добавляем наш метод main. Это делает нас в 10 раз лучше разработчиков!

19 | if __name__ == "__main__":
20 |     account_creation()
Вход в полноэкранный режим Выход из полноэкранного режима

Вот и все!

Да, это так просто!

Давайте протестируем код в нашем терминале

➜ python3 main.py
Please enter a username: elmo
Please enter a password:
Account created.
Войти в полноэкранный режим Выйти из полноэкранного режима

Я ввел имя пользователя elmo и пароль elmoloveshisgoldfishandcrayon123.

Теперь мы проверим, был ли создан файл, используя ls.

➜ ls 
elmo.txt main.py
Вход в полноэкранный режим Выход из полноэкранного режима

Как вы можете видеть, существует файл с именем elmo.txt. Я открою файл, чтобы проверить его содержимое.

cat elmo.txt
$6$rounds=200000$gYlAWMks4mttsMxS$xDjy0WP5d/zTL0hF/Y.ATqv1J5Yrji4pyerh6znnie01qKdMmAXrzqg7FV.9XtKHiGN/5p3aHsglCg2mA3kVY0%
Войти в полноэкранный режим Выход из полноэкранного режима

Ого. Посмотрите на этот длинный хэшированный пароль!

Хотите узнать больше о SHA-2?

https://en.wikipedia.org/wiki/SHA-2

Посмотрите код на Github: github.com/applericky/hasher

Код

from passlib.handlers.sha2_crypt import sha512_crypt as hasher
from getpass import getpass


def database_create(username, password):
    file = open(f"{username}.txt", "w")
    file.write(password)
    file.close()
    print("Account created.")


def account_creation():
    username = input("Please enter a username: ")
    password = getpass("Please enter a password: ")
    hashed_password = hasher.hash(password, rounds=200_000)
    database_create(username, hashed_password)


if __name__ == "__main__":
    account_creation()
Вход в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий