sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
extra_vars5 | |
extra_vars6 |
1. 암호화와 복호화
javax.crypto
패키지를 사용하여 문자열을 암호화하는 Java 예제를 아래에 제공합니다.
이 예제에서는 AES 암호화 알고리즘을 사용하여 문자열을 안전하게 암호화하고 복호화하는 방법을 보여줍니다.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.SecureRandom;
import java.util.Base64;
public class StringEncrypter {
// AES 암호화에 사용할 키를 생성합니다.
public static SecretKey generateKey(int n) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(n);
return keyGenerator.generateKey();
}
// 초기화 벡터(IV)를 생성합니다.
public static IvParameterSpec generateIv() {
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
return new IvParameterSpec(iv);
}
// 문자열을 AES 암호화합니다.
public static String encrypt(String algorithm, String input, SecretKey key, IvParameterSpec iv) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] cipherText = cipher.doFinal(input.getBytes());
return Base64.getEncoder().encodeToString(cipherText);
}
// AES로 암호화된 문자열을 복호화합니다.
public static String decrypt(String algorithm, String cipherText, SecretKey key, IvParameterSpec iv) throws Exception {
Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.DECRYPT_MODE, key, iv);
byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
return new String(plainText);
}
public static void main(String[] args) throws Exception {
String input = "안녕하세요! 이것은 암호화될 메시지입니다.";
SecretKey key = generateKey(128);
IvParameterSpec iv = generateIv();
String algorithm = "AES/CBC/PKCS5Padding";
String cipherText = encrypt(algorithm, input, key, iv);
String plainText = decrypt(algorithm, cipherText, key, iv);
System.out.println("원본 메시지: " + input);
System.out.println("암호화된 메시지: " + cipherText);
System.out.println("복호화된 메시지: " + plainText);
}
}
이 코드는 AES/CBC/PKCS5Padding
알고리즘을 사용하여 문자열을 암호화하고 복호화합니다.
generateKey
메소드는 AES 암호화에 사용될 키를 생성하고, generateIv
메소드는 초기화 벡터(IV)를 생성합니다.
encrypt
메소드와 decrypt
메소드는 각각 문자열을 암호화하고 복호화하는 데 사용됩니다.
main
메소드에서는 이 모든 과정을 실행하여 결과를 출력합니다.
암호화와 복호화 과정에서 사용되는 키와 IV는 매우 중요하므로 안전하게 관리해야 합니다.
또한, 암호화된 데이터는 Base64 인코딩을 사용하여 문자열로 변환되어 출력됩니다.
더 자세한 정보와 다른 암호화 모드에 대해서는 HowToDoInJava와 Baeldung에서 확인할 수 있습니다.
2. 데이터베이스에 SecretKey 인스턴스와 IvParameterSpec 인스턴스를 저장
SecretKey
인스턴스와 IvParameterSpec
인스턴스를 데이터베이스에 저장한 후에 추후 복호화에 사용하는 방법은 다음과 같습니다:
-
암호화 키와 IV 저장:
SecretKey
와IvParameterSpec
의 바이트 배열을 데이터베이스에 저장합니다.
일반적으로 이러한 값들은 Base64 인코딩을 사용하여 문자열로 변환하여 저장합니다. -
데이터베이스 구조: 암호화 키와 IV를 저장할 테이블을 생성합니다.
예를 들어,encryption_keys
라는 테이블에id
,secret_key
,iv
컬럼을 만들 수 있습니다. -
암호화 키와 IV 읽기: 복호화를 수행할 때, 데이터베이스에서 해당
SecretKey
와IvParameterSpec
을 읽어와야 합니다.
이를 위해 저장된 Base64 인코딩된 문자열을 다시 바이트 배열로 변환하고, 이를 사용하여SecretKey
와IvParameterSpec
인스턴스를 재생성합니다. -
복호화 수행: 재생성된
SecretKey
와IvParameterSpec
을 사용하여 암호화된 데이터를 복호화합니다.
다음은 Java 코드 예시입니다:
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
// 데이터베이스에서 읽어온 Base64 인코딩된 키와 IV 문자열
String base64EncodedKey = "여기에_데이터베이스에서_읽어온_키를_넣으세요";
String base64EncodedIv = "여기에_데이터베이스에서_읽어온_IV를_넣으세요";
// Base64 문자열을 바이트 배열로 변환
byte[] decodedKey = Base64.getDecoder().decode(base64EncodedKey);
byte[] decodedIv = Base64.getDecoder().decode(base64EncodedIv);
// 바이트 배열을 사용하여 SecretKey와 IvParameterSpec 인스턴스를 생성
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
IvParameterSpec originalIv = new IvParameterSpec(decodedIv);
// 이제 originalKey와 originalIv를 사용하여 복호화를 수행할 수 있습니다.
보안 주의사항: 암호화 키와 IV는 매우 민감한 정보이므로, 데이터베이스에 저장할 때는 안전한 방법을 사용해야 합니다.
예를 들어, AWS Secrets Manager1와 같은 서비스를 사용하여 키 관리를 할 수 있습니다.
또한, 데이터베이스에 직접 저장하는 대신 애플리케이션의 구성 파일이나 환경 변수를 통해 관리하는 것도 고려해볼 수 있습니다.
이 방법을 사용하여 암호화 키와 IV를 안전하게 관리하면서 필요할 때 쉽게 복호화 작업을 수행할 수 있습니다.
댓글 0
번호 | 제목 | sitelink1 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
공지 | [계속 추가중] SBOM 용어 정의 | 황제낙엽 | 2025.04.10 | 52 | |
공지 | [계속 추가중] Keycloak 용어 및 설정 옵션 정의 | 황제낙엽 | 2024.02.02 | 631 | |
» | [Copilot] javax.crypto 패키지를 사용하여 암호화, 복호화 하는 방법 | 황제낙엽 | 2024.06.07 | 96 | |
12 | Apache Log4j 2 보안 업데이트 권고 | https://www.boho.or.kr/data/secNoticeVie...ence=36389 | 황제낙엽 | 2021.12.13 | 134 |
11 | OpenSSL사용방법 메모, RSA암호의 최대 사이즈, JCA/JCE가이드 | 황제낙엽 | 2007.09.27 | 173 | |
10 | Java Cryptography Extension (JCE) 개요 | 황제낙엽 | 2007.09.27 | 345 | |
9 | Java에서 암호화하고 C++에서 복호화하는 방법 | 황제낙엽 | 2007.09.27 | 378 | |
8 | 비밀키를 Keytool에서 취급할 수 있는 형식으로 변환방법 | http://java-house.jp/ml/archive/j-h-b/051472.html | 황제낙엽 | 2007.09.27 | 229 |
7 | 공개키 암호화의 수학적 알고리즘과 자바 구현 | 황제낙엽 | 2007.09.22 | 207 | |
6 | RSA 암호화 알고리즘을 구현한 자바예제 (산술계산) | 황제낙엽 | 2007.09.17 | 326 | |
5 |
RSA 암호화 프로그램 예제 (BigInteger 이용)
![]() | 황제낙엽 | 2007.09.08 | 257 | |
4 | 해쉬를 이용한 패스워드 로그인 | 황제낙엽 | 2007.09.05 | 111 | |
3 |
Java 보안과 암호화 (개론)
![]() | 황제낙엽 | 2007.09.05 | 117 | |
2 | RSA 공개키 암호화 방식 (java.security, javax.crypto, au.net.aba.crypto.provider 패키지 이용) | 황제낙엽 | 2007.09.05 | 279 | |
1 | 자바 암호화 기법 - MD5를 이용한 해쉬키 생성 (Hash) | 황제낙엽 | 2007.09.01 | 316 |