Хранить пароли в безопасности очень важно. Тем более, если вы храните пароли для других. Вы не поверите, сколько компаний хранят информацию о пользователях открытым текстом. Я укажу вам на некоторые статьи и посмотрю, помните ли вы
какие-нибудь из них.
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()