개발 기록이
[JAVA] Base64 인코딩을 이용해서 암복호화하기 본문
1. AES 알고리즘
대칭키 암호화 방식으로 암호화와 복호화에 동일한 키를 사용한다. 이 키는 비밀로 유지되어야 하며 암호화된 데이터는 키를 알고 있는 사람만 복호화할 수 있다. AES 알고리즘 중 AES-256을 사용하여 256비트(32바이트) 키로 더 강력한 보안 방법을 적용해보려고 한다.
2. 암복호화하기
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class CipherExample {
public static void main(String[] args) throws Exception {
// AES-256을 사용하려면 키 길이가 32바이트(256비트)여야 함.
String myKey = "[개발|기록이|AES|암호화]";
int bytesLength = myKey.getBytes().length;
System.err.println("myKey 바이트 값 ::: " + bytesLength);
// myKey값이 32바이트가 아닌 경우 32바이트로 변환
/* if (myKey.getBytes().length < 32) {
while (myKey.getBytes().length < 32) {
myKey += "\0";
}
}
System.err.println("myKey를 32바이트로 변환 ::: " + myKey.getBytes().length); */
SecretKeySpec key = new SecretKeySpec(myKey.getBytes(), "AES");
String email = "studyingbackhoe@test.com";
String encrypt = encrypt(email, key);
System.err.println("암호화 >>> " + encrypt);
String decrypt = decrypt(encrypt, key);
System.err.println("복호화 >>> " + decrypt);
}
// 암호화
public static String encrypt(String data, SecretKeySpec key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
// 복호화
public static String decrypt(String encryptData, SecretKeySpec key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] encryptedBytes = Base64.getDecoder().decode(encryptData);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes);
}
}
1) SecretKeySpec
- AES 알고리즘에서 사용할 비밀키를 생성한다.
- AES-256 방식을 사용하기 위해서는 myKey의 길이는 32바이트(256비트)여야 한다.
2) Cipher.getInstance("AES")
- AES 암복호화를 위한 Cipher 객체를 생성한다.
- 이 Cipher 객체는 나중에 실제로 암호화 및 복호화 작업을 수행하는 데 사용된다.
3) cipher.init(Cipher.ENCRYPT_MODE, key)
- init() 메서드는 Cipher 객체를 초기화하는 역할을 한다.
- (Cipher.ENCRYPT_MODE : 암호화 모드)
4) cipher.doFinal(data.getBytes())
- doFinal() 메서드는 암호화 작업을 실제로 수행한다.
- data.getBytes()로 변환된 원본 데이터를 암호화하여 encryptedBytes에 저장한다.
- 이때 반환된 encryptedBytes는 암호화된 바이트 배열이다.
5) Base64.getEncoder().encodeToString(encryptedBytes)
- 암호화된 바이트 배열인 encryptedBytes를 Base64 인코딩하여 문자열로 변환한다.
- 반환된 값은 암호화된 데이터를 Base64 인코딩한 문자열이다.
* Base64 인코딩을 사용하는 이유
바이트 배열을 텍스트로 변환하여 저장하거나 전송할 때 더 편리하게 사용하기 위함.
6) Base64.getDecoder().decode(encryptedData)
- Base64 디코딩하여 바이트 배열로 변환한다. 암호화된 데이터를 복호화하려면 먼저 Base64에서 원래의 바이트 배열로 변환해야 한다.
- encryptedBytes는 디코딩된 암호화된 바이트 배열이다.
3. 실행 결과

출처 : OpenAI ChatGPT (https://openai.com)
'웹 개발 > Back-end' 카테고리의 다른 글
[JAVA] public, private, static, final 정리 (0) | 2025.01.30 |
---|---|
[JAVA] ExecutorService 비동기 처리 (0) | 2025.01.19 |
[JAVA] 서버 IP와 클라이언트 IP 값 가져오기 (0) | 2024.10.20 |
[Spring] JPA 개념 정리 (Hibernate, Spring Data JPA) (0) | 2024.09.15 |
[Spring] dofilter filterchain 이란? (0) | 2024.08.23 |