← Назад к вопросам

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

1.3 Junior🔥 81 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

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

Хеширование (Hashing)

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

Характеристики:

  • Односторонняя операция — невозможно восстановить исходные данные из хеша
  • Детерминированная — одни и те же данные дают одинаковый хеш
  • Быстрая — вычисляется практически мгновенно
  • Avalanche effect — малейшее изменение входных данных меняет хеш кардинально

Пример в Java:

import java.security.MessageDigest;

public class HashingExample {
    public static String hashPassword(String password) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(password.getBytes());
        
        StringBuilder hexString = new StringBuilder();
        for (byte b : hash) {
            hexString.append(String.format("%02x", b));
        }
        return hexString.toString();
    }
}

Применение:

  • Хранение паролей в БД
  • Проверка целостности файлов
  • Криптографические подписи
  • Идентификация данных

Шифрование (Encryption)

Определение: преобразование открытого текста в зашифрованный текст с использованием ключа, при котором исходные данные можно восстановить.

Характеристики:

  • Двусторонняя операция — можно зашифровать и расшифровать
  • Зависит от ключа — один и те же данные при разных ключах дают разные результаты
  • Сложнее в вычислении — требует больше ресурсов
  • Восстанавливаемость — исходные данные полностью восстанавливаются

Пример в Java:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class EncryptionExample {
    public static String encrypt(String data, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encrypted = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encrypted);
    }
    
    public static String decrypt(String encrypted, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decoded = Base64.getDecoder().decode(encrypted);
        byte[] decrypted = cipher.doFinal(decoded);
        return new String(decrypted);
    }
}

Применение:

  • Защита конфиденциальной информации
  • Передача данных по незащищенным каналам
  • Сохранение чувствительных данных
  • SSL/TLS протоколы

Сравнительная таблица

АспектХешированиеШифрование
ОбратимостьНетДа
КлючНе требуетсяТребуется
ЦельПроверка целостностиКонфиденциальность
СкоростьБыстроМедленнее
Вход/выходПеременное → ФиксированноеПеременное → Переменное
Пример использованияПароли, хеши файловДанные пользователя

Типы хеширования

Рекомендуемые:

  • SHA-256, SHA-512 — для общего использования
  • bcrypt, scrypt, Argon2 — для паролей (имеют встроенную защиту от brute-force)

Устаревшие (не использовать):

  • MD5 — уязвима к коллизиям
  • SHA-1 — теоретически уязвима

Типы шифрования

Симметричное (один ключ):

  • AES (рекомендуется)
  • DES (устаревшее)

Асимметричное (публичный + приватный ключ):

  • RSA
  • ECDSA

Практический пример: защита пароля

// ✅ Правильно для хранения пароля
String hashedPassword = bcrypt.hashpw(password, bcrypt.gensalt(10));
boolean matches = bcrypt.checkpw(inputPassword, hashedPassword);

// ❌ Неправильно
String sha256Hash = hashPassword(password); // восстановить нельзя, но медленно

Выбор между хешированием и шифрованием зависит от задачи: нужна ли возможность восстановления исходных данных.

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