0Pricing
Java Academy · Урок

Симметричное шифрование AES

Шифруйте и расшифровывайте конфиденциальные данные с помощью AES/CBC/PKCS5Padding и API javax.crypto в Java.

«Симметричное шифрование AES» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Симметричное и асимметричное шифрование

При симметричном шифровании для шифрования и расшифровки используется один и тот же ключ (это быстро и подходит для больших объёмов данных). При асимметричном шифровании используется пара открытого и закрытого ключей (оно медленнее и применяется для обмена ключами и создания подписей). AES — стандартный симметричный шифр.

Режимы AES: CBC и GCM

У AES есть несколько режимов. AES/CBC/PKCS5Padding распространён, но не обеспечивает аутентификацию. AES/GCM/NoPadding обеспечивает и шифрование, и аутентификацию (AEAD), поэтому его настоятельно рекомендуется использовать в новом коде.

Генерация ключа AES

Используйте KeyGenerator, чтобы безопасно сгенерировать 256-битный ключ AES.

KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256); // 256-bit key
SecretKey key = kg.generateKey();
// Persist the key:
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());
// Restore the key:
byte[] decoded = Base64.getDecoder().decode(b64Key);
SecretKey restored = new SecretKeySpec(decoded, "AES");

Шифрование AES/GCM

Для режима GCM требуется уникальный 12-байтный вектор инициализации (IV) при каждом шифровании. Для каждой операции шифрования генерируйте новый случайный IV — никогда не используйте один IV повторно с тем же ключом.

byte[] iv = new byte[12]; // 96-bit IV for GCM
new SecureRandom().nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(128, iv); // 128-bit auth tag
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
// Transmit/store: IV + ciphertext (IV is not secret)

Расшифровка AES/GCM

Извлеките IV из сохранённых данных, восстановите спецификацию и расшифруйте данные. GCM автоматически проверяет подлинность — при изменении данных возникает AEADBadTagException.

// Assume stored = iv + ciphertext:
byte[] iv         = Arrays.copyOfRange(stored, 0, 12);
byte[] ciphertext = Arrays.copyOfRange(stored, 12, stored.length);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] plaintext = cipher.doFinal(ciphertext); // throws if tampered

Хранение IV вместе с шифротекстом

IV не является секретом — храните его перед шифротекстом или рядом с ним. Получателю нужен IV для расшифровки. Ключ необходимо хранить в секрете.

byte[] encryptedData = new byte[iv.length + ciphertext.length];
System.arraycopy(iv,         0, encryptedData, 0,          iv.length);
System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length);
String b64 = Base64.getEncoder().encodeToString(encryptedData);

Вывод ключа из пароля (PBKDF2)

Никогда не используйте пароль непосредственно как ключ AES — его энтропия слишком мала. Выводите ключ с помощью PBKDF2, используя случайную соль и большое количество итераций.

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310_000, 256);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] keyBytes = skf.generateSecret(spec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");

Использование провайдера безопасности Java

Провайдер JDK по умолчанию поддерживает AES. Для дополнительных алгоритмов или соответствия требованиям FIPS используйте провайдер Bouncy Castle.

// With Bouncy Castle:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");

Паттерн конвертного шифрования

Шифруйте данные с помощью случайно сгенерированного ключа шифрования данных (DEK). Шифруйте DEK ключом шифрования ключей (KEK), хранящимся в KMS (AWS KMS, HashiCorp Vault). Это ограничивает раскрытие ключей.

AES в приложениях Spring

TextEncryptor из Spring Security или модуль Spring Security Crypto обеспечивают высокоуровневое шифрование AES без необходимости вручную управлять Cipher и IV.

TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("sensitive data");
String decrypted = encryptor.decrypt(encrypted);

Распространённые ошибки

Никогда не делайте следующего: не используйте повторно IV с тем же ключом, не используйте режим ECB (он сохраняет структуру данных), не используйте пароль непосредственно как ключ и не игнорируйте тег аутентификации. В новом коде всегда используйте GCM.

Быстрая проверка

Что обеспечивает AES/GCM, чего не обеспечивает AES/CBC?

Итоги

Используйте AES/GCM/NoPadding для аутентифицированного шифрования. При каждом шифровании генерируйте новый случайный 12-байтный IV. Добавляйте IV перед шифротекстом. Выводите ключи из паролей с помощью PBKDF2. Никогда не используйте один IV повторно с тем же ключом.

Часто задаваемые вопросы

Урок «Симметричное шифрование AES» бесплатный?

Да — полный текст урока «Симметричное шифрование AES» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Симметричное шифрование AES»?

Шифруйте и расшифровывайте конфиденциальные данные с помощью AES/CBC/PKCS5Padding и API javax.crypto в Java. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Симметричное шифрование AES»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Криптографическое хеширование с MessageDigest
  2. Симметричное шифрование AES
  3. HMAC-SHA256 для целостности сообщений
  4. JWT: структура, создание и проверка
← Назад к Java Academy