good.rivening

보안의 중요성 어떤 암호화 알고리즘을 사용해야 할까 본문

보안

보안의 중요성 어떤 암호화 알고리즘을 사용해야 할까

rivening 2023. 11. 29. 18:21

 

서론

 
이따금씩 "DB가 털렸다.", "개인정보가 유출 됐다." 는 기사를 접하곤 한다. 이러한 기사를 처음 접했을 때는 미친거아니냐며 큰 일이 났다고 생각을 했는데 점차 유사 사례가 많이 나오면서 개인 정보 유출 사고에 대해 둔감해졌다. (우리는 모두 심각성을 느껴야해.)
 
그리고 새롭게 입사한 회사에서 앞으로 진행하게 될 프로젝트에 대해 설명을 들으며 보안은 어떻게 구현하면 좋을지?라는 질문을 받았다. 그리고 알고리즘의 정의나 구현법에 대한 공부의 필요성을 느꼈고 암호화에 대한 공부를 시작했다.
 
로 시작했는데, 공부를 하면 할수록 '보안은 그 어느 시스템의 정보보다 가장 중요하다' 는 것을 느꼈고 개발자가 짊어져야 하는 가장 큰 무게라는 것을 깨달았다. 평생 안고가야 할 숙제.. 인터넷을 사용하지 않는 사람을 찾아보기가 더 어려운 세상에서 "당신의 개인 정보는 안전하게 보관될 것"이라는 신뢰는 지켜져야만 한다.
 
문득 평소에 이용하던 시스템을 생각했는데 요즘엔 회원 가입 한 번을 진행하더라도 본인인증(NICE, PASS 등)을 해야하며 아이디도 중복되지 않게 설정해야 하고 패스워드도 "몇 자리 이상, 특수문자, 더 나아가서는 대소문자 구분" 최대한 알기 어렵게 만들도록 요구하는 등 꽤나 과정이 깐깐해진 것을 발견했다.

옛날엔 이름 생년월일 비밀번호 주소 몇개 안 적고 끝났던 것 같은데.. (뭐 아직 그런 사이트들이 있긴하다만)

by the way..
 
이러한 과정들을 다소 불편하다고 여겨지겠지만, 겉으로 보이는 것이 그 정도일 뿐 내부에서는 사용자들이 입력한 개인정보들을 훨씬 더 복잡하게 암호화하여 안전하게 보관하기 위해 구현했을 것임을 ...
 

 

목표.

암호화 알고리즘엔 무엇이 있고,
어떤 이유로 암호화 방식이 발전해 왔는가

 


암호(Cryptography)

평문을 암호문으로 변환 하거나 암호문을 평문으로 변환하는 기술

  • 평문(Plaintext) : 해독 가능한 형태의 텍스트 ex."123456"
  • 암호문(Ciphertext) : 해독 불가능한 형태의 텍스트 ex."aBce1de9f#@riv!"

 

암호화(Encryption)&복호화(Decryption)

  • 암호화(Encryption) : 평문을 암호문으로 변환하는 과정
  • 복호화(Decryption) : 암호문을 평문으로 변환하는 과정

 
 

그렇다면 평문을 암호문으로 어떻게 만들지?

 


양방향 암호화

암호화와 복호화 모두 가능하다 
사용자 주소, 이메일, 번호 또는 전자서명 같이 재사용성이 있는 정보는 암호화 복호화 모두 이루어져야한다
 
 


대칭키(비공개키) 암호화 알고리즘

대칭키 암호화 알고리즘은 암호화와 복호화에 서로 같은 키를 사용하는 알고리즘
주로 데이터 통신 암호화에 많이 쓰인다

  • 암호화/복호화 속도가 공개키 암호화 알고리즘보다 빠르다(최소10~최대1000배).암호화/복호화 속도는 통신 속도에 많은 영향을 끼치므로 당연히 속도가 빠른 것이 통신에 유리하다.
  • 암호문의 크기가 평문보다 크지 않다(암호화 시 데이터 증가가 없다).크기가 증가하지 않는다는 것은 암호화된 데이터의 크기가 평문과 같다는 것이고, 네트워크 대역폭을 추가적으로 필요로 하지 않는다는 것이므로 통신에 적합하다.

 

블록 암호 방식

고정 길이의 블록을 할당하여 암호화하는 방식이다.
 
 
AES(가장 보편적)
1997년 미국 표준 기술연구소(NIST)에 의해서 지정된 암호화 방식이다.
블록 길이가 128비트이고 평문을 128비트 암호문으로 출력한다. 키 크기에 따라 AES-128, AES-192, AES-256으로 나뉜다.
높은 안전성과 속도를 가지고 있다. 랜섬웨어에 많이 사용된다.
 
DES
1975년 미국의 연방 표준국(NTS)에서 개발한 대칭키 방식의 암호화 알고리즘이다.
블록크기는 64bit이며, 키 길이는 56bit이다.
다량의 문서를 암호화 할 수 있다. Feistel 네트워크가 변형된 형태이다.
DES를 세번 적용해서 키 길이를 세배 늘리는 방식인 3-DES 기법이 있다. 
 
SEED
1999년에 한국정보진흥원에서 개발한 알고리즘이다. 
인터넷, 전자상거래, 무선통신 등에 사용하기 위해 만들어진 알고리즘이며 DES와 유사하게 FeistelNetwork를 사용한다.
블록길이가 128비트이다.
 
ARIA
ARIA는 국가보안기술연구소에서 개발한 블록 암호 알고리즘이며 현재까지 대한민국의 국가 표준 암호 알고리즘으로 사용되고 있다. 블록크기가 128bit이며, 키 크기는 128,192,256으로 사용할 수 있다. 라운드 수는 12,14,16으로 나뉜다.
 
IDEA
1990년 스위스에서 만들어진 PES를 개량하여 만들어진 블록 암호 알고리즘이다. FeistelNetwork방식과 SPN의 중간형태 구조를 가진다. 블록길이가 64bit이며, 키길이가 128bit이다. 라운드 수는 8이다.

 

스트림 암호 방식

유사 난수를 연속적으로 생성하여 암호문을 생성하는 방식이다
 
 
LFSR
LFSR은 현재 상테에서 선형 연산을 통해 다음 상태를 생성하는 레지스터이다. 블록암호에 비해 경량 및 고속 동작이 용이하다. 긴 의사 난수 결과를 생성하는 좋은 방법(스트림 암호의 난수를 생성하는 용도)이다.
 
RC4
로널드 라이베스트가 만들었다. 스트림 암호방식이다.
각 단계에서 키스트림 한 바이트를 생성한다. LFSR의 구조를 가지지 않으며 옥텟 단위를 기반으로 한다.
비트 단위의 암호화 보다 실행속도가 빠르다.
 
 
그런데… 대칭키 암호화 알고리즘은 데이터를 보내는 A와 데이터를 받는 B가 동일한 키를 갖고 있어야 되는데, A와 B가 어떻게 같은 키를 가질 수 있게 할까? A가 키를 만들고 이 키를 네트워크를 통해 B에게 전달하는 식의 방법은 해커가 중간에서 키를 가로챌 수 있기 때문에 부적절하다. 이를 Key bootstrapping 또는 Key agreement problem 이라고 한다.


비대칭키(공개키) 암호화 알고리즘

 
대칭키 암호화 알고리즘은 암호화와 복호화에 서로 다른 키를 사용하는 알고리즘
주로 데이터 암호화(평문 또는 대칭키 등)나 인증에 사용된다.
 
암호화 할때와 복호화 할 때의 키가 서로 다르기 때문에 암복호화 과정에서 보다 보안이 강화된다는 장점이 있다.
하지만 대칭키 방식보다 데이터 전송 속도가 느리다는 단점이 있다.
 
 

        •  

  1. A는 공개키(Public key)와 개인키(Private key)를 생성한다..
  2. B는 A의 공개키를 조회하고, A의 공개키를 이용하여 데이터를 암호화한 후 전송한다
  3. A는 개인키로 암호화된 데이터를 복호화한다.해커는 개인키를 알지 못하므로 복호화할 수 없다.
  • 공개키 암호화: A의 공개키를 이용하여 암호화된 데이터는 A의 개인키로만 복호화가 가능하다.
  • 개인키 암호화: A의 개인키를 이용하여 암호화된 데이터는 A의 공개키로만 복호화가 가능하다.

 
그리고 인증에 사용되는 예시를 A라는 고객이 은행에서 인터넷 뱅킹을 하는 상황으로 알아보자.

  1. A는 은행에 자신의 공개키를 보낸다.
  2. 은행은 대칭키(비밀키)를 A의 공개키를 이용하여 암호화한 다음 전송한다.해커가 암호화된 값을 탈취해도 A의 개인키를 알지 못하므로 복호화할 수 없다.
  3. A는 자신의 개인키로 복호화하여 은행의 대칭키를 추출한다.
  4. A와 은행 사이의 통신은 대칭키를 통해 암호화된다.
  5. 그런데 여기에는 한 가지 문제점이 있다. 만약 해커 Z가 은행에 접속해서 마치 자신이 A인 것처럼 위장하고 자신의 공개키로 전송하면 어떻게 될까? 만약 은행이 속는다면, 은행은 Z의 공개키를 이용하여 비밀키를 암호화한 후 전송할 것이고 Z는 자신의 개인키로 이를 복호화하여 비밀키를 획득할 수 있게 된다.
      •  

이러한 공격을 막기 위해서는 은행이 A의 공개키를 인증할 수 있는 방법(인증서) 이 필요한데, 이 때 사용되는게 개인키 암호화 이다. A의 개인키로 암호화를 하고 공개키와 함께 전달하면, 은행은 A의 공개키로 복호화해서 데이터 제공자(A)의 신원을 확인 할 수 있게 된다. 해커가 공개키와 암호화된 데이터를 탈취하여 복호화가 가능하다는 위험성이 있지만, 이러한 인증 방식은 데이터 보호가 아닌 데이터 제공자(A)의 신원을 보장하는 용도로 사용된다. 이러한 인증 방법이 공인인증체계의 기본 바탕이 되는 전자서명이다.
 
 
RSA
공개키 암호시스템의 하나로 암호화뿐만 아니라 전자서명이 가능한 최초의 알고리즘.
Ron Rivest, Adi Shamir, Lenard Adleman 세 사람이 연구한 암호화 알고리즘이며 세 사람의 약자를 따서 RSA라고 한다.
RSA는 소인수분해를 기반으로한 암호화 알고리즘이다.
안전성이 높아 가장 널리 쓰이고 있는 비대칭키 암호화 알고리즘이다.
 
Diffie-Hellman
디피와 헬만이 개발한 암호화 알고리즘이다.
실제 키를 전송하지 않고도 A와 B가 동일한 키를 생성할 수 있도록 하는 알고리즘으로 암호화되지 않은 통신망을 통해 공통의 비밀 키를 공유할 수 있도록 한다. (비대칭키 알고리즘에서 사용되는 키 교환 방식)
이산대수의 계산이 어려운 문제를 기본 원리로 하고 있다.
 
ECC
타원곡선 암호라고도 한다. RSA 암호화의 대안으로 제안되었다.
짧은키로도 동일한 암호화 성능을 가지며, 계산 복잡도 이론을 활용하여 암호화 한다.
 
EIGamal
타헤르 엘가말이 제안한 암호화 알고리즘이다.
이산대수 문제의 난해함을 활용하여 암호화한다.
 
 
키가 유출되거나, 관리하기에 어려움이 존재하기 때문에 단방향 암호화로 발전되었다.

    •  

단방향 암호화

 
일방향 방식은 임의 길이의 정보를 입력받아 고정된 길이의 암호문을 출력하는 암호방식이므로 해시 암호 방식이라고도 한다. 암호화 후 복호화 할 수 없다. 해시는 임의 값을 넣어도 고정된 길이의 값으로 매핑하는 알고리즘이기 때문에 데이터 손실이 일어나기 때문에 복호화가 불가능하다.
 
사용자 비밀번호 - 사용자가 입력한 비밀번호를 암호화 하여 DB에 저장이 될때, 모든 접근자(개발자포함)는 암호화 된 코드를 다시 평문으로 볼 수 없다. (예외 - RainbowTable)
 

유추해보기.

복호화가 불가능하기 때문에 프로그램내에서 '비밀번호 찾기' 기능을 눌렀을 때 기존에 사용하던 비밀번호를 알려주는 것이 아닌, 새로운 비밀번호를 생성해서 보내주거나 새롭게 생성하게끔 구현했구나

 
 
checksum(중복검사), 패스워드 검증, 민감데이터 보증에 사용된다.
 


MAC

메시지 인증코드로 메시지의 무결성과 송신자의 인증을 보장한다. 메시지가 외부에 노출돼도 상관없을 때 사용한다. MAC 방식은 양방향 암호화 알고리즘보다 빠르다는 장점을 가지고 있지만 기밀성을 제공하지 않기 때문에 보안에 취약하다는 단점이 있다.
 
HMAC
암호화 해시 함수와 기밀 암호화 키를 수반하는 특정한 유형의 메시지 인증 코드이다.
메시지를 암호화 하지않고 메시지를 전송할때 해시 값을 동반해서 보낸다.
IPsec, SSH, TLS 프로토콜 등에 사용된다.
 


MDC

변경 감지 코드로 메시지의 무결성의 보장해주는 알고리즘이다. 메시지 변경 감지 코드는 베시지의 변경을 확인하면서 데이터의 무결성을 판단한다.
 
MD5(Message-Digest algorithm 5)
128 비트 암호학 해시 함수로, 1991년에 MD4를 대체하기 위해 고안됬다.
1996년에 암호화 결함이 발견되었고 2008년에 결함을 이용해 SSL 인증서를 변조하는 것이 가능하다고 발표되었다.
현재는 사용해야하지 말아야 할 암호학 해시 함수이다.
 

SHA(Secure Hash Algorithm)

미국 국가안보국(NSA)가 설계 했으며 미국 국가 표준으로 지정되어있다.
 
SHA-0: 최초의 함수는 SHA 라고 불리고 나중에 설계된 함수들과 구별하기 위해 SHA-0 로 통칭했다.
SHA-1: SHA-0을 변형한 함수 이다.
SHA-2: SHA-1 을 변형하여 SHA-224, SHA-256, SHA-384, SHA-512 의 4가지 변형 함수가 나왔고 이들을 통칭해 SHA-2라고 한다.
SHA-2 의 함수 뒤에 붙는 숫자에 따라 해시값 크기 및 블록 크기등이 결정된다.


현재는 SHA-256 이상의 알고리즘을 사용하기를 권장한다. 왜??
SHA-0 및 SHA-1은 충돌이 발견되었다.
또한 SHA-2도 SHA-1을 변형한 함수이기 때문에 공격이 발생될 가능성이 있다고 지적한다.
 
SHA-2(Secure Hash Algorithm2)
미국 국가안보국(NSA)에서 설계한 암호화 해시 함수들의 집합으로 digest size는 224, 256, 512 bit로 해시함수로 구성되어있다. GPU를 이용한 연산 속도가 매우 빠르기 때문에 password 암호화에는 권장되지 않는다. GPU 연산 속도가 빠를수록 공격자의 하드웨어를 통한 오프라인 brute-force에 더 취약하다.
 
빠른 해시를 사용하여 암호화를 진행할 시 공격자는 오프라인 공격으로 초당 수 십억 개의 해시를 계산할 수 있다.
 


SHA를 보완해 좀더 쉽게 사용가능하도록 구현된 알고리즘

 
PBKDF2 
해시 함수의 컨테이너인 PBKDF2는 솔트를 적용한 후 해시 함수의 반복 횟수를 임의로 선택할 수 있다. PBKDF2는 아주 가볍고 구현하기 쉬우며, SHA와 같이 검증된 해시 함수만을 사용한다.(Django 에서 사용)
 
미국표준기술(NIST) 에서 승인된 알고리즘이고 미국 정부 시스템에서도 사용하는 알고리즘 이다.
ISO 표준에 적합하다. NIST에서도 승인된 알고리즘이다.
 
 
bcrypt 
bcrypt는 애초부터 패스워드 저장을 목적으로 설계 ,1999년에 발표된 메커니즘이다. 보안에 집착하기로 유명한 OpenBSD에서 기본 암호 인증 메커니즘으로 사용되고 있고 미래에 PBKDF2보다 더 경쟁력이 있다고 여겨진다. 입력값을 72 byte로 해야 해서 조금 귀찮다 하지만 많은 언어에서 지원이 가능하며 쉽게 접할수 있는 암호화 방식이다.
 
실제 운영 사이트에서 Spring Security로 구현해서 사용한 경험이 있음.
 

 
 
scrypt 
scrypt는 상대적으로 최신 알고리즘이며 나머지 둘보다 더 경쟁력 있는 것으로 평가되나, 아직 덜 확산되어 있다. scrypt는 다이제스트를 생성할 때 메모리 오버헤드를 갖도록 설계되어, 억지 기법 공격(brute-force attack)을 시도할 때 병렬화 처리가 매우 어렵다. 따라서 PBKDF2보다 안전하다고 평가되며 미래에 bcrypt에 비해 더 경쟁력이 있다고 여겨진다.

 
PBKDF2의 강화판. 굼벵이 같은 해싱 속도로 유명하다. 2009년에 publish된 key derivation function이다.
OpenSSL 1.1이상을 제공하는 시스템에서만 작동한다. 여러 언어의 라이브러리로 제공된다.
다른 암호 기반 KDF에 비해 많은 양의 메모리를 사용하도록 설계되었다.
 
오프라인 brute-force 공격에 대해 수 십억 번의 작업을 수행할 정도로 강력하지만, 다른 암호 기반 KDF에 비해 많은 양의 메모리 와 CPU를 사용하도록 설계되었다.하드웨어를 구현하는 데 크기와 비용이 훨씬 비싸기 때문에, 주어진 자원에서 공격자가 사용할 수 있는 병렬 처리의 양이 한정적이다.