Надежное хранение паролей имеет решающее значение для любого приложения, которое занимается аутентификацией пользователей. В этой статье блога мы рассмотрим различные методы безопасного хранения паролей в MySQL, одной из самых популярных систем управления реляционными базами данных. Мы рассмотрим как базовые, так и расширенные методы, гарантируя, что у вас будет широкий выбор вариантов в соответствии с вашими конкретными требованиями.
Метод 1. Хранение паролей в виде обычного текста (не рекомендуется)
Давайте начнем с самого простого метода — хранения паролей в виде обычного текста. Хотя этот метод прост в реализации, он крайне небезопасен, и его следует избегать любой ценой. Хранение паролей в виде обычного текста делает их уязвимыми для несанкционированного доступа в случае взлома базы данных.
Пример кода:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
password VARCHAR(255)
);
INSERT INTO users (username, password)
VALUES ('john_doe', 'password123');
Метод 2: хеширование паролей с помощью соли
Хеширование паролей – широко распространенная практика защиты учетных данных пользователей. Он предполагает применение к паролю односторонней хэш-функции и сохранение полученного хеш-значения. Для повышения безопасности мы вводим концепцию соли — случайного значения, добавляемого к каждому паролю перед хешированием. Значение соли хранится вместе с хешированным паролем.
Пример кода:
import hashlib
import os
def hash_password(password):
salt = os.urandom(16) # Generate a random salt
password = password.encode('utf-8')
hashed_password = hashlib.pbkdf2_hmac('sha256', password, salt, 100000)
return salt + hashed_password
# Storing the hashed password in the database
hashed_password = hash_password('password123')
Метод 3. Использование bcrypt для хеширования паролей
bcrypt — популярная криптографическая хеш-функция, специально разработанная для хеширования паролей. Он автоматически генерирует и управляет солями, что делает его удобным выбором для безопасного хранения паролей.
Пример кода:
import bcrypt
def hash_password(password):
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
return hashed_password
# Storing the hashed password in the database
hashed_password = hash_password('password123')
Метод 4: функции деривации ключей (KDF)
Функции получения ключей, такие как PBKDF2 и scrypt, требуют больших вычислительных затрат, что усложняет злоумышленникам подбор паролей методом грубой силы. Эти функции вводят фактор стоимости, который определяет вычислительную сложность процесса хеширования.
Пример кода (с использованием PBKDF2):
import hashlib
import os
def hash_password(password):
salt = os.urandom(16)
password = password.encode('utf-8')
hashed_password = hashlib.pbkdf2_hmac('sha256', password, salt, 100000)
return hashed_password
# Storing the hashed password in the database
hashed_password = hash_password('password123')
Метод 5: Argon2 для хеширования паролей
Argon2 является победителем конкурса хеширования паролей и считается самым современным алгоритмом хеширования паролей. Он обеспечивает отличную устойчивость как к атакам методом грубой силы, так и к атакам по побочным каналам.
Пример кода:
import argon2
def hash_password(password):
hash_engine = argon2.PasswordHasher()
hashed_password = hash_engine.hash(password)
return hashed_password
# Storing the hashed password in the database
hashed_password = hash_password('password123')
В этой статье мы рассмотрели несколько методов безопасного хранения паролей в MySQL. Мы обсудили важность отказа от хранения обычного текста и продемонстрировали использование алгоритмов хеширования, таких как bcrypt, PBKDF2 и Argon2. Помните, что использование надежных методов хранения паролей необходимо для защиты пользовательских данных и поддержания доверия пользователей вашего приложения.