Код-ревью 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»: ломается всегда применение.
Что должен найти ревьюер
- Безопасностьстрока 2Ключ захардкожен в коде и угадываем: должен храниться в KMS или хранилище секретов.
- Безопасностьстрока 3Нулевой статический IV: даже при смене режима повтор IV разрушает безопасность.
- Безопасностьстрока 6ECB: одинаковые блоки дают одинаковый шифртекст, нет проверки целостности. Нужен AES/GCM/NoPadding со случайным 12-байтовым nonce.
- Безопасностьстрока 12MD5 без соли для паролей. Нужен Argon2id или bcrypt (например из Spring Security).
- Безопасностьстрока 17
java.util.Randomпредсказуем, а 64 бит мало для токена. НуженSecureRandomи 32 байта.
Разбор
Пять ошибок применения: ключ в коде, статический IV, ECB без целостности, быстрый хеш для паролей, некриптографический генератор. Ни одна не связана со «слабым AES»: ломается всегда применение.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.