서버에서 동작하는 Application은 Java 기반으로, 그 데이터와 연동되는 다른 API 기능은 PHP로 개발을 진행하는 와중에 두 사이에서 같은 데이터를 암/복호화해서 사용하는 상황이 발생하였습니다.
처음엔 Laravel Framework의 Crypt Facades를 사용하여 라라 벨에서만 복호화를 진행하였는데, Java Application에서 암호화시킨 데이터를 같은 맥락으로 Laravel Framework에서 복호화시켜 사용해야 함에 따라 기본 Laravel App Key를 사용했던 Crtpt Facades를 대체하며 같이 Java에서 사용할 AES256 알고리즘 형태의 암복호화 소스가 필요해졌고, Java는 아래 형태로 개발을 진행하게 되었습니다.
[연관글]
1. AES256Crypt Class 생성 및 encode, decode function 생성
package testGradleProject.app;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Base64;
public class Aes256Crypt {
public static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
public static String aes256Encode(String str, String key) throws Exception {
byte[] textBytes = str.getBytes(StandardCharsets.UTF_8);
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, newKey, ivSpec);
return Base64.getEncoder().encodeToString(cipher.doFinal(textBytes));
}
public static String aes256Decode(String str, String key) throws Exception {
byte[] textBytes = Base64.getDecoder().decode(str);
AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
SecretKeySpec newKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec);
return new String(cipher.doFinal(textBytes), StandardCharsets.UTF_8);
}
}
2. Main Class의 Main method에서 실행
package testGradleProject.app;
public class App {
public static final String plainText = "안녕! 반가워 나는 김민규라고해!";
public static final String secretKey = "32fakecodingsecretinyouranykey32";
public static void main(String[] args) {
try {
System.out.println("당신의 secret Key 32Byte를 입력하세요 : "+secretKey);
System.out.println("당신의 secret Key 는 ["+secretKey.getBytes().length+"] Byte입니다. ");
String encryptText = Aes256Crypt.aes256Encode(plainText, secretKey);
String decryptText = Aes256Crypt.aes256Decode(encryptText, secretKey);
System.out.println("암호화된 값 : "+encryptText);
System.out.println("복호화된 값 : "+decryptText);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 출력
'Language > Java' 카테고리의 다른 글
Java로 Builder Program 만들기 (1) - Java JGit Library 사용해서 Git Controller하기 (0) | 2022.12.27 |
---|---|
Java로 Firebase Cloude Message (Application Push) 구현하기 (0) | 2022.07.19 |
Java로 Apache Kafka Consumer 구독 구현하기 (0) | 2022.06.20 |
[Gradle] Gradle로 Java Application 생성 및 실행하기 (0) | 2022.06.08 |
Log4j에 대한 학습 - Log4j 의 개념 및 Log4j2 (0) | 2022.05.30 |