📚 Теория: Управление криптографическими ключами (раскрыть)
Master key в коде = уязвимость
Ключ сохраняется в репозитории, попадает в jar/war и его можно извлечь через strings/bytecode.
🔓 Потеря контроля над шифрованием и конфиденциальностью данных.
Best practices
Ключи выдаёт KMS или Secret Manager. Приложение получает временные токены, а не хранит ключи локально.
🛡️ Включайте аудит, ротацию и минимальные привилегии.
Собранный jar попадает к злоумышленнику.
Атакующий читает массив байт и восстанавливает мастер-ключ.
Все архивы/пароли можно дешифровать и подделать.
Что делать: хранить ключи в HSM/KMS, получать временные data keys через envelope encryption, никогда не коммитить ключи в repo.
Контекст
Команда реализовала быстрый сервис шифрования для временных файлов. Чтобы «не разбираться с Vault», ключ сохранили в массиве байт. Нужно показать, что это шаг к полной компрометации данных.
- Найди, как строится объект
SecretKeySpec. - Оцени последствия утечки: расшифровка архивов, подмена данных.
- Предложи использование Secret Manager/KMS и ротацию ключей.
Сниппет
Code Review
Референс-фигура
Ключи нужно получать во время выполнения из KMS или Secret Manager. Код должен работать с абстракцией, а не с хардкоженными байтами.
Флаг ревью: FLAG{java-hardcoded-crypto-key}
public class EncryptionUtil {
private final KeyManagementClient kms;
public EncryptionUtil(KeyManagementClient kms) {
this.kms = kms;
}
public String encrypt(String plaintext) throws GeneralSecurityException {
SecretKeySpec key = kms.fetchDataKey();
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(result);
}
}
Рассмотри envelope encryption: KMS хранит master key, а приложение использует временные data keys. Включи аудит и регулярную ротацию.
Проверка флага
Введи флаг из референс-решения, чтобы лаборатория появилась в прогрессе.