암호화에 대해
- 암호화의 종류
암호화의 종류는 크게 3종류로 나뉜다.
- 단방향 암호화 -> 복호화가 불가능하다.
- 비밀키 암호화 -> 평문에 암호화 키 값을 이진수 연산 처리하여 암호문을 생성을 한다. 암호문을 받은 수신자는 동일한 암호화 키 값을 역으로 대입해 역처리하여 암호문을 해독할 수 있다.
- 공개키 암호화 -> 서로 다른 두 개의 키, 공개키와 개인키를 사용하여 암호화하고 복호화가 가능하다. 공개키로 암호화하고 개인키로 해독한다. 만약 개인키와 공개키의 위치를 바꿔 실행하면 ‘전자서명’이 된다. 암호화 방식의 결정은 처한 환경에 따라 달라진다.
우리가 사용할 암호화의 방식은 단방향 암호화이니, 단방향 암호화에 대해 좀 더 알아보자.
단방향 암호화
-
단방향 암호화의 알고리즘은 Hash 방식을 사용한다.
Hash는 데이터를 다루는 기법 중에 하나로 검색과 저장이 아주 빠르게 된다.
하나의 key(input)이 들어오면 key마다 다양한 길이가 존재한다. 하지만, 함수로 일정한 길이 만큼의 문자로 바꾸어 저장을 하게 되면 컴퓨터의 자료구조상 더욱 효율적으로 데이터를 다룰 수 있다.
이때 사용되는 것이 hash fucntion 해시 함수 이다. 해시 함수로 일정한 크기의 값이 완성이 되면
그 결과값을 배열의 인덱스로 사용하여 저장하게 되고, 앞서 말한것처럼 key-value형식의 해시함수에서 데이터의 검색과 저장을 빠르게 이용하게 되는 것이다.
대표적인 예로, SHA 해시함수가 존재한다.암호화(SHA-256)예시
hunter2 -> f52fbd32b2b3b86ff88ef6c490628285f482af15ddcb29541f94bcf526a3f6c7
hunter2는 key, 오른쪽 결과물은 value 가 될 수 있다.
만약 비밀번호를 저장할 때 보안용으로 해시함수를 사용하게 된다면,
hunter2가 입력되는 암호라고 한다면 오른쪽은 sha-256암호화를 통해 나온 암호, ‘다이제스트’라고 한다.단방향 암호화의 특징으로는 암호화는 가능하나, 복호화가 불가능 하다.
단방향 암호화의 문제점
-
해싱된 값(다이제스트)을 대규모로 확보한 뒤,
특정 해싱값에 대해 반복 대조를 하기 시작하면 어렵지 않게 그 해싱값의 원본을 찾아낼 수 있을 것이다.
이때의 대규모로 확보해둔 데이터를 Rainbow Table이라고 하며,
이를 활용한 공격을 Rainbow Attack이라고 한다. -
해시 함수는 암호화를 위한 것이 아니라 빠른 조회를 위해 고안된 것이다.
다르게 말하면 공격자가 이러한 해시 함수의 특성을 활용해서 매우 빠른 속도로 임의의 데이터를 비교, 대조할 수 있다.
([MD5]를 사용한 경우 일반적인 장비를 이용하여 1초당 56억 개의 다이제스트를 대입할 수 있다)
MD5 : MD5는 128비트 암호화 해시 함수이다. 임의의 길이의 메시지(variable-length message)를 입력받아, 128비트짜리 고정 길이의 출력값을 낸다.단점 극복
-
솔팅(Salting) :
솔트는 말그대로 소금이라는 의미를 갖고 있다. 우리가 음식에 간을 더하기 위해 소금을 치듯, 임의의 데이터를 해싱할 때 일종의 소금과 같은 추가적인 데이터를 함께 해시하는 것을 의미한다. 이러한 방식을 사용하면 만약에 Rainbow Attack을 이용해 원본값을 알아낸다 하더라도 정확한 원본을 파악하기 힘들다. 그래서 Key Stretching을 추가적으로 이용한다. -
키 스트레칭 :
입력한 패스워드의 다이제스트를 생성하고, 생성된 다이제스트를 입력 값으로 하여 다이제스트를 생성하고, 또 이를 반복하는 방법으로 다이제스트를 생성할 수도 있다. 이렇게 하면 입력한 패스워드를 동일한 횟수만큼 해시해야만 입력한 패스워드의 일치 여부를 확인할 수 있다. 이것이 기본적인 키 스트레칭 과정이다. 솔트와 함께 임의의 데이터를 해싱하여 다이제스틀르 생성하고, 이것을 또다시 해시하고, 또 해시하고… 를 임의의 수만큼 반복한다. 따라서 원본값까지의 추적을 굉장히 어렵게 만든다. -
Adaptive Key Derivation Functions :
adaptive key derivation function은 다이제스트를 생성할 때 솔팅과 키 스트레칭을 반복하며 솔트와 패스워드 외에도 입력 값을 추가하여 공격자가 쉽게 다이제스트를 유추할 수 없도록 하고 보안의 강도를 선택할 수 있다. 이 함수들은 GPU와 같은 장비를 이용한 병렬화를 어렵게 하는 기능을 제공한다. 이와 같은 기능은 프로그램이 언어에서 제공하는 라이브러리만으로는 구현하기 어렵다.
Key Derivation Function(KDF)의 종류
- [bcrypt]
- [argon2]
참조