Каковы основные цели шифрования данных?

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

Ответ

Основные цели шифрования данных в информационной безопасности:

  1. Конфиденциальность (Confidentiality)

    • Что: Обеспечение доступности данных только авторизованным пользователям или системам.
    • Как: Преобразование открытого текста (plaintext) в шифрованный текст (ciphertext) с использованием алгоритма и ключа.
    • Пример: Шифрование данных на диске (BitLocker) или при передаче по сети (TLS/SSL в HTTPS).
  2. Целостность (Integrity)

    • Что: Гарантия того, что данные не были изменены несанкционированно во время хранения или передачи.
    • Как: Использование криптографических хеш-функций (SHA-256) или кодов аутентификации сообщений (HMAC).
  3. Аутентификация (Authentication)

    • Что: Подтверждение подлинности источника данных или идентичности сторон, участвующих в обмене.
    • Как: Использование цифровых сертификатов и инфраструктуры открытых ключей (PKI) в протоколах типа TLS.
  4. Неотрекаемость (Non-repudiation)

    • Что: Предотвращение возможности для стороны отрицать факт отправки или получения информации.
    • Как: Применение цифровых подписей на основе асимметричного шифрования (RSA, ECDSA).

Пример шифрования на Java с использованием AES:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AesExample {
    public static void main(String[] args) throws Exception {
        String plainText = "Hello, Secure World!";
        String secretKey = "MySuperSecretKey16"; // Должен быть 16/24/32 байта для AES

        // Создание ключа
        SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "AES");

        // Инициализация шифра для шифрования
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        // Шифрование
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("Зашифрованный текст: " + encryptedText);
    }
}

Важно: В реальных приложениях используйте надежные, случайно сгенерированные ключи и более безопасные режимы (например, AES/GCM/NoPadding), а не ECB.