В чем разница между хешированием и шифрованием?

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

Ответ

Хеширование и шифрование — это фундаментально разные криптографические процессы с различными целями.

Хеширование

  • Цель: Проверка целостности данных (например, паролей, файлов).
  • Процесс: Односторонняя (необратимая) функция, преобразующая входные данные произвольной длины в строку фиксированной длины (хеш).
  • Ключ: Не требуется.
  • Пример (Java, SHA-256):
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hash = digest.digest("myPassword123".getBytes(StandardCharsets.UTF_8));
    // Результат: массив байт фиксированной длины (32 байта для SHA-256)

Шифрование

  • Цель: Обеспечение конфиденциальности данных.
  • Процесс: Двусторонняя (обратимая) функция. Данные шифруются с помощью ключа и могут быть расшифрованы обратно с помощью того же (симметричное) или парного (асимметричное) ключа.
  • Ключ: Обязателен.
  • Пример (Java, AES):
    
    // Шифрование
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte[] encryptedData = cipher.doFinal(plainText.getBytes());

// Расшифровка cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedData = cipher.doFinal(encryptedData);



### Сравнительная таблица
| Критерий | Хеширование | Шифрование |
| :--- | :--- | :--- |
| **Обратимость** | Нет (одностороннее) | Да (двустороннее) |
| **Использование ключа** | Нет | Да (симметричный/асимметричный) |
| **Длина вывода** | Фиксированная | Обычно равна или чуть больше длины ввода |
| **Основное назначение** | Целостность, верификация | Конфиденциальность |
| **Типичное применение** | Хранение паролей, цифровые подписи, контрольные суммы | Защита передаваемых данных, шифрование файлов |

**Важно:** Для хранения паролей всегда используйте **адаптивные** хеш-функции (bcrypt, scrypt, Argon2), а не простые (MD5, SHA-1), которые уязвимы к перебору.