Как определить алгоритм хеширования, если известна соль и открытый текст пароля?
У меня есть таблица в базе данных с записями пользователей, содержащими столбцы password-hash (хеш пароля) и password-salt (соль пароля). Я знаю открытый текст пароля для одного из этих пользователей. Столбец salt имеет тип varchar(20), а столбец hash — varchar(64).
Возможно ли определить конкретный алгоритм хеширования на основе этой информации? Моя цель — генерировать надежные начальные пароли для новых пользователей, поскольку текущее программное обеспечение предоставляет только слабые пароли. Мне нужно понять алгоритм хеширования, чтобы создавать пароли, которые будут работать с существующей системой аутентификации.
Когда вы знаете и соль, и открытый текст пароля, вы можете определить алгоритм хеширования путем систематического тестирования различных алгоритмов с использованием известных значений и сравнения полученного хеша с сохраненным хешем. Длина хеша (varchar(64)) указывает на SHA-256, так как он создает ровно 64 шестнадцатеричных символа, в то время как длина соли (varchar(20)) совместима с различными современными алгоритмами хеширования. Вам необходимо будет систематически тестировать распространенные алгоритмы, начиная с тех, которые соответствуют формату длины вашего хеша.
Содержание
- Understanding Hash Length Clues
- Systematic Algorithm Testing Process
- Common Hashing Algorithms and Their Signatures
- Practical Implementation Steps
- Tools for Algorithm Identification
- Generating Compatible Strong Passwords
Understanding Hash Length Clues
Длина вашего сохраненного хеша (varchar(64)) предоставляет наиболее прямую подсказку о потенциальном алгоритме. Длины хешей определяются базовой криптографической функцией:
- 64 символа: Обычно указывает на SHA-256 (256 бит = 32 байта = 64 шестнадцатеричных символа)
- 128 символов: Обычно указывает на SHA-512 (512 бит = 64 байта = 128 шестнадцатеричных символов)
- Переменная длина: Может указывать на bcrypt, scrypt или Argon2 (которые используют кодирование Base64)
Важное замечание: То, что ваш столбец хешей содержит ровно 64 символа, указывает на SHA-256, но это не является окончательным подтверждением. Некоторые реализации могут усекать или форматировать хеши по-разному.
Длина соли (varchar(20)) также информативна:
- Современные лучшие практики рекомендуют использовать соли длиной 16-32 байта
- Ваш лимит varchar(20) может вмещать различные размеры соли
- Содержимое самой соли (а не только ее длина хранения) важнее для определения алгоритма
Systematic Algorithm Testing Process
Когда у вас есть и соль, и открытый текст пароля, вы можете следовать этому систематическому подходу:
Шаг 1: Анализ формата хеша
Изучите сохраненный хеш на предмет идентифицирующих шаблонов:
- Содержит ли он знаки доллара (algorithmhash`?
- Является ли он чисто шестнадцатеричным (0-9, a-f)?
- Содержит ли он другие символы (/, +, =), указывающие на кодирование Base64?
Шаг 2: Генерация кандидатных хешей
Для каждого предполагаемого алгоритма сгенерируйте хеш с использованием:
- Вашего известного открытого текста пароля
- Сохраненного значения соли
- Распространенных параметрических значений (например, количество итераций для PBKDF2, коэффициенты стоимости для bcrypt)
Шаг 3: Сравнение результатов
Сравните сгенерированный вами хеш с сохраненным хешем. Совпадение подтверждает алгоритм.
Согласно экспертам по безопасности, “Проверьте размер вывода, исключите несовпадающие, затем убедитесь, что остальные также используют соль. Теперь, в оставшемся списке, попробуйте каждый из них по очереди.”
Common Hashing Algorithms and Their Signatures
Семейство SHA-256
- SHA-256: 64 шестнадцатеричных символа, без префикса соли
- PBKDF2-HMAC-SHA256: Обычно 64 символа, может содержать количество итераций
- HMAC-SHA256: 64 символа, требует секретный ключ
Адаптивные функции вывода ключа
- bcrypt: Начинается с
$2a$,$2b$или$2y$, всего 60 символов - scrypt: Начинается с
$7$, переменная длина - Argon2: Начинается с
$argon2i$,$argon2d$или$argon2id$
Унаследованные алгоритмы Unix
- crypt(): Первые 2 символа - соль, остальное - хеш
- MD5: 32 шестнадцатеричных символа (ваш 64-символьный хеш исключает эту возможность)
Практический совет: OWASP Password Storage Cheat Sheet предоставляет отличные руководства по характеристикам алгоритмов и уровням безопасности.
Practical Implementation Steps
Пример реализации кода
Вот как вы можете реализовать это на Python:
import hashlib
import binascii
def test_algorithm(password, salt, stored_hash):
# Тест SHA-256
sha256_hash = hashlib.sha256((password + salt).encode()).hexdigest()
if sha256_hash == stored_hash:
return "SHA-256"
# Тест PBKDF2-HMAC-SHA256
pbkdf2_hash = binascii.hexlify(
hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), 100000)
).decode()
if pbkdf2_hash == stored_hash:
return "PBKDF2-HMAC-SHA256"
# Добавьте здесь тесты для других алгоритмов...
return "Неизвестно"
# Использование
password = "известный_пароль"
salt = "соль_из_базы_данных"
stored_hash = "64_символьный_хеш_из_базы_данных"
algorithm = test_algorithm(password, salt, stored_hash)
print(f"Обнаруженный алгоритм: {algorithm}")
Подход к тестированию в базе данных
Если у вас есть доступ к базе данных, вы можете создать тестовую функцию:
-- Пример для PostgreSQL
CREATE OR REPLACE FUNCTION test_password_hash(p_password TEXT, p_salt TEXT, p_hash TEXT)
RETURNS TEXT AS $$
BEGIN
-- Тест SHA-256
IF SHA256(p_password || p_salt) = p_hash THEN
RETURN 'SHA-256';
END IF;
-- Тест других алгоритмов...
RETURN 'Неизвестно';
END;
$$ LANGUAGE plpgsql;
Tools for Algorithm Identification
Hashcat
Hashcat имеет обширную встроенную поддержку алгоритмов хеширования паролей. Вы можете использовать его для одновременного тестирования нескольких алгоритмов:
# Тест с известной солью и паролем
hashcat -m 0 -a 0 hash.txt wordlist.txt
Где -m 0 указывает режим хеширования (вы можете попробовать разные режимы).
Онлайн-идентификаторы хешей
Несколько онлайн-инструментов могут помочь определить алгоритмы:
Библиотеки программирования
- Python:
hashlib,passlib,bcrypt - PHP:
hash(),password_hash()функции - JavaScript:
cryptoAPI
Предупреждение о безопасности: При использовании онлайн-инструментов будьте осторожны при отправке чувствительных данных, таких как известные пароли.
Generating Compatible Strong Passwords
Анализ требований к паролям
- Длина: Большинство современных систем поддерживают пароли длиной до 72 байт
- Наборы символов: Определите, поддерживаются ли специальные символы
- Требования к энтропии: Рассчитайте минимальную необходимую сложность
Генерация надежных паролей
import secrets
import string
def generate_strong_password(length=16):
characters = string.ascii_letters + string.digits + string.punctuation
return ''.join(secrets.choice(characters) for _ in range(length))
# Генерация нескольких надежных паролей
for i in range(10):
print(generate_strong_password())
Вопросы реализации
- Смена паролей: Реализуйте регулярную смену паролей
- Многофакторная аутентификация: Добавьте дополнительные уровни безопасности
- Ограничение частоты запросов: Защитите от атак методом перебора
Согласно лучшим практикам безопасности, “Хорошее правило - использовать соль такого же размера, как и вывод хеш-функции. Например, вывод SHA256 составляет 256 бит (32 байта), поэтому соль должна быть не менее 32 случайных байт.”
Conclusion
Определение алгоритма хеширования, когда вы знаете и соль, и открытый текст пароля, полностью достижимо через систематическое тестирование. Длина хеша в 64 символа указывает на SHA-256, но вы должны подтвердить это, сгенерировав тестовые хеши с использованием ваших известных значений. Начните с наиболее вероятных кандидатов на основе длины и формата хеша, затем систематически протестируйте каждый из них. Как только алгоритм будет определен, вы сможете генерировать надежные, безопасные пароли, которые работают с вашей существующей системой аутентификации, значительно повышая безопасность. Помните, что современная безопасность паролей требует большего, чем просто сильные алгоритмы - реализуйте хорошие политики паролей, многофакторную аутентификацию и регулярные проверки безопасности для поддержания надежной защиты.
Sources
- Password Storage - OWASP Cheat Sheet Series
- Get hash algorithm knowing hash, salt and password - Information Security Stack Exchange
- Secure Salted Password Hashing - How to do it Properly
- Salt (cryptography) - Wikipedia
- Password Hashing & Salting - Function and Algorithm Explained - Authgear
- Can you find the salt if you have the original password in plaintext and the hashed version? - Cryptography Stack Exchange
- Add Salt to Hashing: A Better Way to Store Passwords | Auth0
- Password Hashing Algorithms - FusionAuth
- How to find the hashing algorithm used to hash passwords? - Unix & Linux Stack Exchange
- Password Hashing: How to hash and salt passwords in different languages and why it’s important - SuperTokens