easycode

하이브리드 암호화 (RSA, AES) (1) - 개념 설명 본문

카테고리 없음

하이브리드 암호화 (RSA, AES) (1) - 개념 설명

ez() 2024. 2. 1. 21:36

프로젝트에서 비밀번호 암호화를 해야 하는데, 프론트엔드(클라이언트)와 데이터를 주고 받는 과정에서 혹시나 중간에 비밀번호가 탈취 당할 가능성을 생각해 이리저리 알아보다가 하이브리드 암호화를 알게 되었다. 현재 프로젝트에선 아래 진행순서 대로 비밀번호를 암호화해서 주고 받고 있다.

참고로 이 글은 2탄 구현을 위한 이해 단계 정도로 조금 쉽게 쓰였습니다. 좀더 자세한 원리나 방식이 알고 싶다면 다른 분들의 글을 참고해주세요. 이 글이 누군가에게 도움이 되기를 바라며 오늘도 시작하겠습니다!

 


암호화 진행순서

암호화 진행순서는 다음과 같습니다.

  1. 백엔드에서 RSA key pair 생성
  2. 프론트엔드로 RSA public key(공개키) 전송
  3. 프론트엔드에서 사용자에게 비밀번호를 받아서 AES128/CBC 방식으로 암호화 (encryptedPassword)
  4. AES key와 iv(CBC 방식에 필요)를 합쳐 백엔드에게 받은 RSA public key로 암호화 (encryptedKey) -> 여기서 aes key를 세션키라고도 부른다.
  5. 백엔드에게 암호화된 비밀번호와 암호화된 key 전달
  6. 백엔드는 암호화된 키(encryptedKey)를 RSA secret key(개인키)로 복호화
  7. 복호화된 평문(key)에서 AES key 추출
  8. 암호화된 비밀번호를 AES key와 iv를 통해 복호화
    복호화된 평문(password)에 salt 추가 후, SHA256으로 암호화 (salt는 rainbow 테이블 방지하기 위해 사용)

 

 


RSA란?

  • 비대칭키(공개키, 개인키 혹은 비밀키) 암호화 방식 → 데이터를 암호화/복호화 하는데 사용되는 키가 다름
  • 암호화 키는 공개(공개키)되어 사용되고, 복호화 키는 반대로 비공개(개인키)로 된 시스템
  • 누구든지 공개키를 사용해 암호화 가능, 개인키를 알아야 복호화 가능
  • 비교적 느린 속도로 인해 직접 암호화할 때보다 속도가 비교적 빠른 대칭키 암호화 기술을 쓸 때, 암호화 키를 암호화하여 전달할 때 주로 쓰인다.  → 우리도 AES Key를 암호화하는데 사용했다!!
  • 공개키로 암호화된 데이터는 개인키를 소유한 공개키 생성자만이 복호화 가능하다. 즉, 개인키가 다르면 해당 데이터를 복호화할 수 없다 (엄청 희박한 확률로 되는 경우는 있지만 데이터가 깨져서 보인다고 한다)

 


RSA 암호화 방식

  1. A가 B에게 RSA 알고리즘을 이용해 정보를 안전하게 보내고 싶어 한다.
  2. B가 공개키와 개인키를 만들어 A에게 공개키를 보낸다. (개인키는 B만 가지고 있다. 보통 서버가 B?)
  3. A가 B로 받은 공개키를 이용해 보낼 정보를 암호화한다.
  4. A에 암호화된 정보를 B에게 보낸다.
  5. B가 암호화된 정보를 받고 개인키를 이용하여 암호를 해독한다.

 


AES란?

  • 암호화와 복호화 키가 동일한 대칭키 암호화
  • AES256은 미국 정부에서도 공식적으로 사용되며, 전 세계적으로 널리 인정받는 암호화 표준 중 하나이다.
  • 암호화와 복호화 키가 동일해 암/복호화 과정이 간단하고 빠르다.
  • AES는 RSA와 같은 비대칭키 암호화 알고리즘에 비해 매우 빠르다. 대량의 데이터를 빠르게 암호화하거나 복호화할 때 유리하다.

 


RSA vs AES (비대칭키 vs 대칭키)

  • 수행 속도를 따졌을 때, RSA 암호화 방식이 KeyPair 생성 과정 포함 AES 암호화 방식보다 성능이 떨어진다.
  • 서버 CPU, Disk IO 부하로 성능 이슈는 단순 수치로 표현할 수 없다.
  • RSA 공개키 암호화 방식은 성능보다 보안에 집중되는 알고리즘이다.
    • 공개키로 암호화된 데이터는 개인키를 소유한 공개키 생성자만이 복호화 가능하다.
    • 사용자(클라이언트)마다 공개키와 개인키를 접근 시 새로 생성/발급하여 원본 데이터 추적이 불가능하다.