AES 대칭 암호화
Java의 javax.crypto API를 사용하여 AES/CBC/PKCS5Padding으로 민감한 데이터를 암호화하고 복호화합니다.
AES 대칭 암호화은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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 준수가 필요하면 BouncyCastleProvider 공급자를 사용하십시오.
// With Bouncy Castle:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");봉투 암호화 패턴
무작위로 생성한 데이터 암호화 키(DEK)로 데이터를 암호화하십시오. KMS(AWS KMS, HashiCorp Vault)에 저장된 키 암호화 키(KEK)로 DEK를 암호화하십시오. 이렇게 하면 키가 노출될 가능성을 줄일 수 있습니다.
Spring 애플리케이션에서 AES 사용하기
Spring Security의 TextEncryptor 또는 Spring Security Crypto 모듈은 Cipher와 IV를 직접 관리하지 않고도 고수준의 AES 암호화를 제공합니다.
TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("sensitive data");
String decrypted = encryptor.decrypt(encrypted);일반적인 주의 사항
다음은 절대 하지 마십시오. 같은 키로 IV를 재사용하거나, 패턴이 보존되는 ECB 모드를 사용하거나, 비밀번호를 키로 직접 사용하거나, 인증 태그를 무시하지 마십시오. 새 코드에는 항상 GCM을 사용하십시오.
빠른 확인
AES/CBC에는 없고 AES/GCM이 제공하는 기능은 무엇입니까
복습
인증된 암호화에는 AES/GCM/NoPadding을 사용하십시오. 암호화마다 새로운 임의의 12바이트 IV를 생성하십시오. IV를 암호문 앞에 붙이십시오. PBKDF2로 비밀번호에서 키를 파생하십시오. 같은 키로 IV를 절대 재사용하지 마십시오.
자주 묻는 질문
“AES 대칭 암호화” 강의는 무료인가요?
네 — “AES 대칭 암호화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“AES 대칭 암호화”에서 뭘 배우나요?
Java의 javax.crypto API를 사용하여 AES/CBC/PKCS5Padding으로 민감한 데이터를 암호화하고 복호화합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“AES 대칭 암호화” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.