НейроАгент

Определение алгоритма хеширования паролей: Полное руководство

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

Вопрос

Как определить алгоритм хеширования, если известна соль и открытый текст пароля?

У меня есть таблица в базе данных с записями пользователей, содержащими столбцы password-hash (хеш пароля) и password-salt (соль пароля). Я знаю открытый текст пароля для одного из этих пользователей. Столбец salt имеет тип varchar(20), а столбец hash — varchar(64).

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

НейроАгент

Когда вы знаете и соль, и открытый текст пароля, вы можете определить алгоритм хеширования путем систематического тестирования различных алгоритмов с использованием известных значений и сравнения полученного хеша с сохраненным хешем. Длина хеша (varchar(64)) указывает на SHA-256, так как он создает ровно 64 шестнадцатеричных символа, в то время как длина соли (varchar(20)) совместима с различными современными алгоритмами хеширования. Вам необходимо будет систематически тестировать распространенные алгоритмы, начиная с тех, которые соответствуют формату длины вашего хеша.

Содержание


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: Анализ формата хеша

Изучите сохраненный хеш на предмет идентифицирующих шаблонов:

  • Содержит ли он знаки доллара (),указывающиенаформатывроде), указывающие на форматы вроде `algorithmsaltsalthash`?
  • Является ли он чисто шестнадцатеричным (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:

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}")

Подход к тестированию в базе данных

Если у вас есть доступ к базе данных, вы можете создать тестовую функцию:

sql
-- Пример для 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 имеет обширную встроенную поддержку алгоритмов хеширования паролей. Вы можете использовать его для одновременного тестирования нескольких алгоритмов:

bash
# Тест с известной солью и паролем
hashcat -m 0 -a 0 hash.txt wordlist.txt

Где -m 0 указывает режим хеширования (вы можете попробовать разные режимы).

Онлайн-идентификаторы хешей

Несколько онлайн-инструментов могут помочь определить алгоритмы:

Библиотеки программирования

  • Python: hashlib, passlib, bcrypt
  • PHP: hash(), password_hash() функции
  • JavaScript: crypto API

Предупреждение о безопасности: При использовании онлайн-инструментов будьте осторожны при отправке чувствительных данных, таких как известные пароли.


Generating Compatible Strong Passwords

Анализ требований к паролям

  • Длина: Большинство современных систем поддерживают пароли длиной до 72 байт
  • Наборы символов: Определите, поддерживаются ли специальные символы
  • Требования к энтропии: Рассчитайте минимальную необходимую сложность

Генерация надежных паролей

python
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

  1. Password Storage - OWASP Cheat Sheet Series
  2. Get hash algorithm knowing hash, salt and password - Information Security Stack Exchange
  3. Secure Salted Password Hashing - How to do it Properly
  4. Salt (cryptography) - Wikipedia
  5. Password Hashing & Salting - Function and Algorithm Explained - Authgear
  6. Can you find the salt if you have the original password in plaintext and the hashed version? - Cryptography Stack Exchange
  7. Add Salt to Hashing: A Better Way to Store Passwords | Auth0
  8. Password Hashing Algorithms - FusionAuth
  9. How to find the hashing algorithm used to hash passwords? - Unix & Linux Stack Exchange
  10. Password Hashing: How to hash and salt passwords in different languages and why it’s important - SuperTokens