유지보수 중인 프로젝트들의 DB접속정보 암호화 요청으로 인하여 전자정부 3.8이상의 버전은 crypto 간소화서비스를, 3.7이하 버전에는 AES방법, ASP는 base64방식을 사용하여 암호화를 하였다.
첫번째 방식인 crypto방식은 아래 참고
[암호화]DB접속정보 암호화하기1(crypto)
유지보수 중인 프로젝트들의 DB접속정보 암호화 요청으로 인하여 전자정부 3.8이상의 버전은 crypto 간소화서비스를, 3.7이하 버전에는 AES방법, ASP는 base64방식을 사용하여 암호화를 하였다. 첫번째
soondevnote.tistory.com
두번째로는 전자정부 프레임워크에서 제공하는 crypto 간소화 서비스를 이용하지 못하는 egov3.7이하 버전에서 사용하기 위한 AES 방식이다
전자정부프레임워크 뿐만아니라 어디서도 사용이 가능하다.
egov버전 : 3.7
java : 1.8
1. AES.java 추가
package egovframework.com.cmm.util;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
class AES {
public static String algorithms = "AES/CBC/PKCS5Padding";
private final static String AESKey = "6fd9377e588611ee989ff01898ecfc7a"; //32byte
private final static String AESIv = "cf3kptdenbwoe7bi"; //16byte
// AES 암호화
String encrypt(String planText){
try {
String result;
Cipher cipher = Cipher.getInstance(algorithms);
SecretKeySpec keySpec = new SecretKeySpec(AESKey.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(AESIv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
byte[] encrypted = cipher.doFinal(planText.getBytes(StandardCharsets.UTF_8)); // ID 암호화(인코딩 설정)
result = Base64.getEncoder().encodeToString(encrypted); // 암호화 인코딩 후 저장
return result;
}
catch (Exception e) {
System.out.println("암호화 중 오류 발생하였습니다. ");
e.printStackTrace();
}
return "";
}
// AES 복호화
String decrypt(String encText){
try {
Cipher cipher = Cipher.getInstance(algorithms);
SecretKeySpec keySpec = new SecretKeySpec(AESKey.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(AESIv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
byte[] decodedBytes = Base64.getDecoder().decode(encText);
byte[] decrypted = cipher.doFinal(decodedBytes);
return new String(decrypted, StandardCharsets.UTF_8);
}
catch (Exception e) {
System.out.println("복호화 중 오류 발생하였습니다. ");
e.printStackTrace();
}
return "";
}
public static void main(String[] args) {
AES aes = new AES();
System.out.println(aes.encrypt("com.mysql.jdbc.Driver")); //DB접속정보 DriverClassName
System.out.println(aes.encrypt("jdbc:mysql://127.0.0.1:3306/test")); //DB접속정보 Url
System.out.println(aes.encrypt("test")); //DB접속정보 UserName
System.out.println(aes.encrypt("test1234")); //DB접속정보 Password
System.out.println(aes.decrypt("디코딩"));
}
}
main sysout쪽에 DB접속정보를 넣어 프로젝트 우클릭 run as > java application을 사용하여
암호화된 DB접속정보를 가져온다
위 값들을 제대로 암호화 됐는지 확인을 하려면
System.out.println(aes.decrypt("디코딩"));
"디코딩" 자리에 암호화 된것을 넣으면 제대로 됐는지 확인이 가능하다.
2. CustomBasicDataSource.java 추가
package egovframework.com.cmm.util;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.stereotype.Component;
import egovframework.com.cmm.util.AES;
@Component
public class CustomBasicDataSource extends BasicDataSource{
@Override
public void setPassword(String password) {
String playinText = decode(password);
super.setPassword(playinText);
}
private String decode(String enctext) {
AES aes = new AES();
return aes.decrypt(enctext);
}
@Override
public void setUrl(String url) {
String playinText = decode(url);
super.setUrl(playinText);
}
@Override
public void setUsername(String username) {
String playinText = decode(username);
super.setUsername(playinText);
}
@Override
public void setDriverClassName(String driverclassname) {
String playinText = decode(driverclassname);
super.setDriverClassName(playinText);
}
}
3. 1번작업에서 얻은 암호화된 값을 globals.properties에 입력
Globals.DriverClassName=kKLBCgUhInxNpK5G6uUEMbPhrGtHuX3rzZg3KhDqcZM=
Globals.Url=wewNJ6uBWXoruPS/RfR2nXPtupYEsEsEqGJzw2fcmJrOyYdEu3HaS9OjbVQ7t7HM
Globals.UserName =lcBKWKMf10d5n3D8O0DzHA==
Globals.Password =x39mFdvMfNDpwL1pjB+2cw==
4. context-datasource.xml 변경
<!-- MySQL -->
<!-- <bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> -->
<bean id="dataSource-mysql" class="egovframework.com.cmm.util.CustomBasicDataSource" destroy-method="close">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}" />
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
기본으로 설정되어있는 줄을 주석처리하고 2번에서 추가한 곳을 class에 추가한다. globals.properties에 암호화 한 것들을 디코딩해주는 작업을 해준다.
BASE64 이어서 작성예정
crypto암호화방법 확인하기
[암호화]DB접속정보 암호화하기1(crypto)
유지보수 중인 프로젝트들의 DB접속정보 암호화 요청으로 인하여 전자정부 3.8이상의 버전은 crypto 간소화서비스를, 3.7이하 버전에는 AES방법, ASP는 base64방식을 사용하여 암호화를 하였다. 첫번째
soondevnote.tistory.com
'개발노트' 카테고리의 다른 글
[mysql ] Ibatis procedure OUT 파라미터 받기 (0) | 2024.04.26 |
---|---|
[암호화]DB접속정보 암호화하기3(BASE64) (0) | 2024.03.05 |
[암호화]DB접속정보 암호화하기1(crypto) (0) | 2024.02.23 |
[NICE인증] IBMJCE에러 com.ibm.crypto.provider.IBMJCE (2) | 2024.01.31 |
[supabase] Supabase edge functions 사용해보기 (0) | 2023.11.15 |