Что такое хеш-сумма и каковы её свойства?

Ответ

Хеш-сумма (хеш) — это результат работы криптографической хеш-функции, преобразующей произвольный массив данных (строку, файл) в строку фиксированной длины (последовательность символов).

Основные свойства:

  1. Детерминированность: Одинаковые входные данные всегда дают одинаковую хеш-сумму.
  2. Фиксированный размер: Выходная строма имеет постоянную длину (например, MD5 — 32 hex-символа, SHA-256 — 64).
  3. Быстрота вычисления.
  4. Эффект лавины: Малейшее изменение входных данных (1 бит) полностью меняет хеш.
  5. Необратимость (стойкость к восстановлению): По хешу практически невозможно восстановить исходные данные.
  6. Устойчивость к коллизиям: Крайне мала вероятность, что разным данным соответствует одинаковый хеш.

Применение:

  • Проверка целостности данных (скачанных файлов).
  • Хеширование паролей в базах данных.
  • Построение хеш-таблиц.
  • Цифровые подписи.

Пример вычисления SHA-256 в Java:

import java.security.MessageDigest;
import java.math.BigInteger;

public class HashExample {
    public static String calculateSHA256(String input) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = md.digest(input.getBytes("UTF-8"));
        // Конвертируем байты в hex-строку
        BigInteger number = new BigInteger(1, hashBytes);
        StringBuilder hexString = new StringBuilder(number.toString(16));
        // Дополняем нулями слева
        while (hexString.length() < 64) {
            hexString.insert(0, '0');
        }
        return hexString.toString();
    }

    public static void main(String[] args) throws Exception {
        String data = "Hello, World!";
        String hash = calculateSHA256(data);
        System.out.println(hash);
        // dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
    }
}

Ответ 18+ 🔞

Давай разберем эту всю хеш-суммовую магию, чтобы не сидел как Герасим, блядь, и не говорил «Му-му», когда тебя спросят, что это за хуйня.

Представь, у тебя есть любой кусок данных — хоть «Война и мир», хоть фотка твоей собаки, хоть просто слово «хуй». Хеш-сумма — это как будто ты пропускаешь этот массив через мясорубку, а на выходе получаешь всегда одну и ту же по длине сосиску из цифр и букв. Эта сосиска и есть хеш.

Какие у этой сосиски, прости господи, свойства, блядь:

  1. Детерминированность. Это не я, это термин. Означает, что один и тот же кусок мяса (данных) ты сколько ни крути — сосиска будет одинаковая. Засунул «привет» — получил одну сосиску. Ещё раз засунул «привет» — получил ту же самую, блядь, сосиску. Не подсовывай мне тут колбасу другого сорта.
  2. Фиксированный размер. Неважно, что ты засовываешь: мысль о смысле жизни или инструкцию к микроволновке — сосиска будет стандартной длины. MD5 — 32 знака, SHA-256 — 64 знака. Как пачка сигарет, только из символов.
  3. Быстрота. Современный процессор щёлкает эти хеши как семечки. Не то что в мои молодые годы, блядь...
  4. Эффект лавины. Вот это, сука, самое офигенное. Изменил в исходнике одну буковку, один бит, один пиксель — и вся сосиска на выходе абсолютно другая, до неузнаваемости. Не «немного другая», а пиздец как другая. Как будто вместо котлеты в мясорубку сунул динамит.
  5. Необратимость. Вот эту самую сосиску невозможно обратно превратить в «Войну и мир». Вообще. Можно пытаться, но это как из котлеты по-киевски восстановить курицу, которая её снесла. Удачи, епта.
  6. Устойчивость к коллизиям. Вероятность, что для двух РАЗНЫХ данных выпадет ОДИНАКОВАЯ сосиска (хеш), — овердохуище мала. Практически ноль. Это как найти двух людей с одинаковыми отпечатками пальцев. Теоретически можно, но на практике — хуй там.

А где эту хуйню применяют?

  • Проверка целостности. Скачал ты порно-архив с торрентов. Рядом лежит файлик porno_archive.iso.sha256. Посчитал хеш своего скачанного файла — сравнил с тем, что в файлике. Совпало? Значит, тебе не подсунули вместо фильма запись «Пусть говорят». Не совпало? Качай заново, тебя наебали.
  • Пароли. Умные дядьки в базах данных хранят не сам твой пароль «12345», а его хеш. Когда ты входишь, система хеширует введённую «12345» и сравнивает с тем, что лежит в базе. Совпало — welcome. Даже если базу утянут, хакеры увидят только эти самые сосиски, а не пароли. Красиво, блядь.
  • Хеш-таблицы. Быстрый поиск данных, но это уже другая история, в рот меня чих-пых.
  • Цифровые подписи. Тоже всё на этом держится, но если начну объяснять, у меня терпения ноль ебать.

Ну и примерчик на Java, чтобы не быть просто болтуном:

import java.security.MessageDigest;
import java.math.BigInteger;

public class HashExample {
    public static String calculateSHA256(String input) throws Exception {
        // Берём мясорубку с надписью "SHA-256"
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        // Пихаем в неё наши данные
        byte[] hashBytes = md.digest(input.getBytes("UTF-8"));
        // Полученную мясную массу (байты) переводим в красивую hex-сосиску
        BigInteger number = new BigInteger(1, hashBytes);
        StringBuilder hexString = new StringBuilder(number.toString(16));
        // Если сосиска коротковата, набиваем её нулями слева, как полагается
        while (hexString.length() < 64) {
            hexString.insert(0, '0');
        }
        return hexString.toString(); // Ваша сосиска готова к подаче
    }

    public static void main(String[] args) throws Exception {
        String data = "Hello, World!";
        String hash = calculateSHA256(data);
        System.out.println(hash);
        // Выведет: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
        // Попробуй изменить строку data хоть на йоту — и весь этот красивый набор символов пойдёт пиздой.
    }
}

Вот и вся магия, ёпта. Не благодари.