Ответ
Хеширование и шифрование — это фундаментально разные криптографические процессы с различными целями.
Хеширование
- Цель: Проверка целостности данных (например, паролей, файлов).
- Процесс: Односторонняя (необратимая) функция, преобразующая входные данные произвольной длины в строку фиксированной длины (хеш).
- Ключ: Не требуется.
- Пример (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), которые уязвимы к перебору.