AES는 고급 암호화 표준이라는 의미이며, 암호화 및 복호화 시 동일한 키를 사용하는 대칭키 알고리즘입니다.
AES의 종류는 AES-128, AES-192, AES-256이 있고 각각 뒤에 붙은 숫자가 키의 길이를 의미합니다.
AES 암호화 알고리즘은 높은 안정성과 빠른 속도로 전세계적으로 사용되고 있습니다.
2. AES 암호화 설명
1) Secret Key
Secret Key는 평문을 암호화하는데 사용되며 절때로 외부에 노출되어서는 안됩니다. AES의 종류가 무엇이냐에 따라 Secret Key의 길이가 달라집니다.
(AES-256는 256비트(32바이트)의 키를 사용합니다.)
2) Block Cipher
AES는 128비트(16바이트)의 고정된 블록 단위로 암호화를 수행합니다. (이는 암호화 키의 길이와 전혀 무관합니다) 암호화를 수행할 때 여러가지 Block Cipher Mode를 선택할 수있으며 크게 CBC, ECB 등이 있습니다. 권장하는 방식은 CBC 방식입니다.
AES는 128비트의 블록단위로 암호화를 수행하는데 128비트보다 작은 블록이 생길 경우 부족한 부분을 특정 값으로 채워야합니다. 이러한 작업을 패딩이라고 부르며, 대표적으로 PKCS5, PCKS7 방식이 있습니다.
3) CBC (Ciper Block Chaning)
AES는 128비트의 고정된 블록 단위로 암호화를 수행하는데, CBC는 블록을 그대로 암호화 하지않고 이전에 암호화했던 블록과 XOR 연산을 한 다음에 암호화를 수행합니다.
그래서 같은 내용을 갖는 원문 블록이라도 전혀다른 암호문을 갖게됩니다. 그런데 첫번째 블록은 이전 암호화 블록이 없기 때문에 이를 위해 IV(initialization vector)를 이용합니다.
AES는 128비트(16바이트)단위로 암호화 하기때문에 IV또한 16바이트 크기여야합니다. IV가 생성되면 이 값을 가지고 첫번째 블록을 암호화 합니다. 매번 다른 IV를 생성하면 같은 평문이라도 다른 암호문을 생성할 수 있습니다.
3. AES-256 예제
public class Main {
public static void main(String[] args) throws Exception {
AES256 aes256 = new AES256();
String text = "!! Hello World !!";
String cipherText = aes256.encrypt(text);
System.out.println(text);
System.out.println(cipherText);
System.out.println(aes256.decrypt(cipherText));
}
}
05-Apr-2021 15:38:25.517 INFO [java-sdk-http-connection-reaper] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [ch.qos.logback.classic.spi.ThrowableProxy]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [ch.qos.logback.classic.spi.ThrowableProxy]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1372)
at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1360)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1219)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180)
at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:119)
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:419)
at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
at ch.qos.logback.classic.Logger.log(Logger.java:765)
at org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog.debug(LogAdapter.java:470)
at com.amazonaws.http.IdleConnectionReaper.run(IdleConnectionReaper.java:190)
위와 같은 오류가 발생 할 경우 tomcat destroy 시 logback을 종료시키는 코드를 넣어주어야 합니다.
import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;
public class ShutdownHookConfiguration {
public void destroy() {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
loggerContext.stop();
}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Bean(destroyMethod = "destroy")
public ShutdownHookConfiguration shutdownHookConfiguration() {
return new ShutdownHookConfiguration();
}
}
spring boot를 사용하다보면 명시적으로 자원을 close 해주어야 하는 경우가 있습니다. 이때 spring boot destory event 발생 시 자원을 close해주는 코드를 추가해주면 됩니다.
public class ShutdownHookConfiguration {
public void destroy() {
/* close 로직*/
}
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Bean(destroyMethod = "destroy")
public ShutdownHookConfiguration shutdownHookConfiguration() {
return new ShutdownHookConfiguration();
}
}
ShutdownHookConfiguration 클래스를 생성하고 destroy 메소드를 선언한 후 close 로직을 작성합니다. 그런 다음 SpringBootAplication 어노테이션을 등록한 클래스에 ShutdownHookConfiguration 클래스를 Bean으로 등록한 다음 destroyMethod에 destory메소드를 등록해줍니다.
CREATE TABLE department (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (id)
)
create table member(
id int auto_increment not null,
name varchar(50) not null,
dept_id int null,
primary key(id),
constraint fk_department foreign key (dept_id) references department (id)
);
department 테이블과 member 테이블을 생성했습니다. member 테이블은 department의 id를 참조하고 있습니다.
2) 컬럼 옵션
auto_increment : 숫자 형에 사용가능 하며 자동으로 숫자가 증가하는 속성을 부여합니다. not null : null 값을 가질 수 없습니다. unique : unique key 속성을 부여합니다. 해당 컬럼은 중복된 값을 가질 수 없습니다. default : 기본 값을 지정합니다. check : 특정 값만 가질 수 있게 지정합니다. primary key : 기본키로 지정합니다. foreign key : 외래키로 지정합니다.
#컬럼 옵션 예제
create table member (
id int auto_increment primary key,
name varchar(50) not null,
code char(1) not null default 'A',
email varchar(100) unique,
class char(1) check(class in (1,2,3,4)),
dept_id int null,
constraint fk_department foreign key (dept_id) references department (id)
)
3) ALTER
테이블을 수정할 때 사용하는 명령어 입니다.
3-1) 컬럼 추가
alter table 테이블명 add 컬럼명 컬럼타입 [옵션]
alter table member add column age int not null;
3-2) 컬럼 수정
alter table 테이블명 modify 컬럼명 변경할데이터타입 [옵션]
alter table member modify name varchar(300) null
3-3) 컬럼 삭제
alter table 테이블명 drop 삭제할컬럼명
alter table member drop age;
3-4) 컬럼명 변경
alter table 테이블명 change 변경할컬럼명 새로운컬럼명 컬럼타입
alter table member change name title varchar(100);
3-5) 제약 조건 추가
alter table 테이블명 add constraint 제약조건명 제약조건(컬럼명..)
#유니크 제약조건 추가
alter table member add constraint uk_code_name unique key (code, name);
#기본키 제약조건 추가
alter table member add constraint pk_id_code primary key (id, code)
#외래키 제약조건 추가
#외래키를 지정할 경우 해당 컬럼에 index key가 함께 선언된다.
alter table member add constraint fk_dept_id foreign key (dept_id) references department (id)
3-6) 제약 조건 삭제
alter table 테이블명 drop constraint 제약조건명
#유니크 키 제거
alter table member drop constraint uk_code_name;
#외래키 제거
alter table member drop foreign key fk_dept_id
#인덱스 제거
alter table member drop constraint fk_dept_id
#제약조건명 조회방법
select *
from information_schema.table_constraints
where TABLE_SCHEMA = '데이터베이스명' and TABLE_NAME = '테이블명'
3-7) 테이블 명 변경
alter table 테이블명 rename 새로운테이블명
alter table member rename customer;