Можно ли восстановить исходные данные по их хэшу?

«Можно ли восстановить исходные данные по их хэшу?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, это невозможно для криптографически стойких хэш-функций. Хэш-функции (SHA-256, MD5, SHA-1) проектируются как односторонние (one-way).

Почему нельзя:

  1. Потеря информации: Хэш имеет фиксированную длину (например, 256 бит для SHA-256), а исходные данные могут быть любого размера. Информация безвозвратно теряется.
  2. Вычислительная необратимость: Алгоритм не предусматривает обратной операции. Единственный теоретический способ — полный перебор (brute-force) или атака по словарю, что непрактично для стойких хэшей и сложных данных.

Практические атаки и почему они не являются "восстановлением":

  • Rainbow tables: Предвычисленные таблицы хэшей для популярных паролей. Работают только со слабыми, предсказуемыми исходниками.
  • Коллизии: Нахождение других данных, дающих тот же хэш, но не исходных.

Пример на Java:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashIrreversibility {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String secret = "mySecretPassword123";
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = md.digest(secret.getBytes());
        // Преобразуем байты в читаемый hex-вид
        StringBuilder hexHash = new StringBuilder();
        for (byte b : hashBytes) {
            hexHash.append(String.format("%02x", b));
        }
        System.out.println("Хэш: " + hexHash.toString());
        // По этой строке невозможно алгоритмически получить обратно "mySecretPassword123"
    }
}

Вывод: Хэш используется для проверки целостности данных и хранения паролей (с солью), но не для их шифрования или восстановления.