[암호화] AES, RSA
시작
이번에 작성할 글은 암호화다.
문제
서버와 클라이언트로 분리를 하고, API로 통신을 연결하면서 데이터를 주고 받을때 노출되는 데이터가 보였다.
그래서 이 노출된 데이터를 가리기 위해서 암호화에 대해서 알아보았다.
우선, 암호화는 간단하게 정보(평문)을 특정 알고리즘이나 방법을 이용해서 변경하고, 승인된 유저만 확인할 수 있도록 변환하는 방법으로 볼 수 있다.
암호화 방법은 대칭키 암호화 방법이랑 공개키 암호화 방법이 있다.
대칭키는 암호화와 복호화에 사용되는 키가 같은 암호 알고리즘 방법이고,
공개키는 암호화와 복호화에 사용되는 키가 서로 다르며, 암호화에는 공개키를 복호화에는 비밀키를 이용한다.
각, 암호화 방법의 대표적인 AES 와 RSA로 데이터 암호화를 진행했다.
AES란?
- 대칭형, 블록 암호화 알고리즘으로 Rijndael 알고리즘을 이용한다.
블록 암호화는 일정 비트 수를 암호화 하는 방식이다.
그래서 일정 비트 수가 되지 않으면 패딩으로 빈자리를 채우는 알고리즘(PKCS#7)을 이용한다.
암호화 키는 AES-128, AES-192, AES-256 세 가지 중 하나가 될 수 있으며,
길이에 따른 라운드의 수가 각각 10, 12, 14로 다르게 실행된다.
RSA란?
- 공개키 암호화 알고리즘중 하나이며, SSL/TLS에 가장 많이 사용되는 알고리즘이다.
RSA -2048이 현재 주로 쓰이는데, 뒤의 숫자는 bit으로 암호화가 깨질수록(?) 커져왔다.
미래에는 RSA-8192 뭐 이런식으로 쓸 것 같다.
다만, 대칭형 암호에 비해 암/복호화가 현저히 느리다고 한다.
문제 해결
암/복호화에 대해서 찾아보았다.
AES가 암/복호화에 RSA 보다 빠르다는 장점이 있지만, 키가 서버와 클라이언트에 동일하게 있어야 한다는 단점이 있다.
RSA는 암/복호화가 느리지만, 공개키와 개인키로 나뉘어져 있고 공개키는 공개되어도 상관이 없다는 장점이 있다.
그래서 간단하게 두 암호화를 적용하기로 했다..
우선, 머리속으로 생각한 방법은 아래와 같다.
- AES 키를 클라이언트에서 생성한다.
- 서버에서 RSA 공개키를 보낸다.
- AES 키로 데이터 암호화한다.
- AES 키를 RSA 공개키로 암호화한다.
- 암호화한 AES키와 데이터를 보낸다.
- 받아서 AES키와 데이터를 복호화한다.
다만, 생각대로 되지 않아(6번쪽에서 에러를 해결하지 못했기 때문에)
1차적으론 아래와 같이 구현을 했다.
- 계정 생성시 AES 키를 생성한뒤 저장한다.(Cognito)
- 서버에서 계정에 저장된 AES키와 RSA 공개키를 보낸다.
- AES 키로 데이터 암호화한다.
- 암호화한 데이터를 보낸다.
- 받아서 AES키와 데이터를 복호화한다.
- 일정 시간마다 AES키를 새로 발급받도록 한다.(Lambda)
1차 구현은 AES 키가 그냥 노출되면 그대로 데이터 유출이 뻔했다.
그래서 임시로 AES 키를 지속적으로 새로 발급받고 갱신하도록 했다.
배포를 1차로 두었기에, 임시로 저상태의 암호화 과정을 구현했다.
ECS 상에서 동작이 되는걸 보았으니,
원래 생각했던 암호화 방법으로 업데이트 치기 위해 고도화를 진행할 예정이다.
암/복호화가 생각보다 어려웠으나,
AES와 RSA를 이용해서 암/복호화 하는게 상당히 흥미로웠는데.
저런 방식을 하이브리드 암호화 방식이라고 하는것 같다.
AES와 RSA의 장점을 조합해서 암호화 하는 방식!!
HTTPS에서도 쓰이는 방식이라고.....