Код-ревью Senior Криптография на практике и JWT обновлено

Ревью: шифрование и токены на Java

Вопрос

Найдите ошибки применения криптографии.

public class CryptoUtil {
    private static final byte[] KEY = "0123456789abcdef".getBytes();
    private static final byte[] IV = new byte[16];

    public static byte[] encrypt(byte[] data) throws Exception {
        Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");
        c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(KEY, "AES"));
        return c.doFinal(data);
    }

    public static String hashPassword(String pw) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        return HexFormat.of().formatHex(md.digest(pw.getBytes()));
    }

    public static String resetToken() {
        return Long.toHexString(new Random().nextLong());
    }
}

Коротко

Пять ошибок применения: ключ в коде, статический IV, ECB без целостности, быстрый хеш для паролей, некриптографический генератор. Ни одна не связана со «слабым AES»: ломается всегда применение.

Что должен найти ревьюер

  1. Безопасностьстрока 2
    Ключ захардкожен в коде и угадываем: должен храниться в KMS или хранилище секретов.
  2. Безопасностьстрока 3
    Нулевой статический IV: даже при смене режима повтор IV разрушает безопасность.
  3. Безопасностьстрока 6
    ECB: одинаковые блоки дают одинаковый шифртекст, нет проверки целостности. Нужен AES/GCM/NoPadding со случайным 12-байтовым nonce.
  4. Безопасностьстрока 12
    MD5 без соли для паролей. Нужен Argon2id или bcrypt (например из Spring Security).
  5. Безопасностьстрока 17
    java.util.Random предсказуем, а 64 бит мало для токена. Нужен SecureRandom и 32 байта.

Разбор

Пять ошибок применения: ключ в коде, статический IV, ECB без целостности, быстрый хеш для паролей, некриптографический генератор. Ни одна не связана со «слабым AES»: ломается всегда применение.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.