2016년 11월 17일 목요일

3. Encryption [키 길이의 중요성 && 해시 함수]

키길이의 중요성 과 해시함수

이전 글에서 여러 운영모드에서 키를 사용하는 것을 확인했을 것이다.
그렇다면 키의 속성 중 가장 중요한 키의 길이에 대해 알아보겠다. 키 길이가 보안과 직결되기 때문이다.
이번에도 NIST가 권고하는 보안강도와 키 길이를 이용해 설명한다.



HASH(A)란 전자서명이나 해시만을 사용한 응용 프로그램에 사용할때 쓰는 해시 유형들이고 HASH(B)는 HMAC, 키 유도 함수 , 난수 생성에 사용하는 유형이다.
Minimum of Strength(최소 보안 강도)의 row들은 최소한의 키 길이를 나타낸다. 키 길이가 길수록 '무차별 대입 공격'으로 키를 알아내기 어렵다.  그리고 미래에는 Minimum of Strength가 길어지는데 이 이유는 컴퓨터 성능이 점점 좋아지므로 '무차별 대입 공격'의 시간도 줄어들기 때문이다.
그리고 Symmetric(대칭) 키 알고리즘은 암호화하고 복호화 할때 키가 같다는 이야기 이고 그 옆의 Asymmetric(비대칭) 키 알고리즘은 암호화하고 복호화 하는 키가 다르다는 뜻이다.  대칭키의 2TDEA 는 112비트 키를 사용하는 알고리즘이지만 실제로는 80비트 키로 구현할 수 있는 이상적인 안정성을 가진다. 
112비트 키를 사용하는 3TDEA부터는 각 키 길이에서 구현할 수 있는 최대한의 보안 강도를 가진다.

이제 해시 함수에 대해 알아보자.
해시함수에 필요한 키의 길이 대부분은 위의 표에서 보이듯이 대칭키의 키보다 두배 이상 이다. 
(SHA-1 은 160비트 해시값 출력 , 나머지 SHA-234,SHA-256.. 들은 함수 이름 옆에 숫자가 해시 값 크기를 뜻함)
그렇다면 왜 해시 함수에서 키 길이가 대칭키보다 2배 이상이어야 하는지 또한 해시 함수 유형에 따라 요구하는 키길이가 다른지에 대해 알아보자.

해시 함수

해시 함수는 임의의 길이를 가진 데이터를 특정 길이의 데이터로 변환하는 과정을 말한다.
이전에 배운 블록 암호화는 원본 값과 같거나 거의 비슷한 크기를 암호화했다면 해시 함수는 원본 데이터 값이 얼마큼 길든 상관없이 정해진 길이로 줄여서 변환해 버린다.
원본 일부가 손실되는 압축과 비슷하다. 


위 사진과 같이 긴 원본의 데이터가 해시함수를 거치면 fixed된 길이로 암호화 된다. 또한 블록 암호화와 다른게 해시함수는 원본 데이터가 손실가능하므로 복호화가 불가능하다. 그런데 이런 fixed된 길이로 암호화 하기 때문에 원본이 달라도 hash value(결과값)이 달라질수 가 있는데 이것을 충돌 가능성 이라고 한다.
위의 특성(충돌 가능성) 때문에 대칭 키 알고리즘보다 요구하는 키의 길이가 더길어지는데 이 특성 뿐만 아니라 해시함수가 갖는 특성이 2가지 더있다. 정리하자면 다음과 같다.
  • 역상 저항성 (Preimage Resistance)
  • 제 2 역상 저항성 (second Preimage Resistance)
  • 충돌 저항성(Collision Resistance)

충돌 저항성


위 사진처럼 사용자 입력값이 다른 두 입력에서 같은 hash value(결과 값)를 생성하는 상황이 있다고 가정하자. 
충돌 저항성은 hash value 이 주어지든 말든 같은 두 입력 값 두개를 찾을 수 없다는  특성이다. 그래서 위와 같이 빨간색 hash value를 보고 두 입력값($5000, $5)를 찾을 수있다면 안정하지 못한것이다.


역상 저항성







역상 저항성은 hash value 가 주어졌을때 그 해시 값을 생성하는 입력값을 알아내기 불가능하다는 특성이다. 충돌 저항성과 다른점은 역상 저항성은 hash value가 주어진 상태이고 충돌 저항성은 그럴수도 아닐수도 있다. 또한  충돌 저항성은 해시 값을 생성하는 값 두개를 찾는 과정이고 역상 저항성은 해시 값을  알때 원래 값을 찾아 내는 문제이다.

제 2 역상 저항성 







제 2 역상 저항성은 어떤 입력값(우리가 아는 이미 정해진 입력값 =x)과 동일한 해시 값을 가지는 다른 입력 값(y)을 찾을 수 없어야한다. 즉,  x!=y 이며 Hash(x)=Hash(y)인 y를 찾기 어려워야 한다는 뜻이다.

예시를 통해 세가지 특성을 이해시켜보도록 한다.
보통 비밀번호를 해시 함수로 암호화 하면 로그인 할때 입력하는 비밀번호의 해시값과 저장된 해시 값을 비교하여 사용자를 확인하다고 가정하자.
역상 저항성은 비밀번호의 해시 값이 stored된 DB가 공격을 당해 해시 값이 유출되었을 때 의미가 있다.
충돌 저항성은 비밀번호가 두 개인 상황인데 두 비밀번호의 해시값이 같다면 두 비밀번호중 하나만 알아도 로그인할수 있다는 점이다.
그래서 이런 3가지 특성때문에 일반 대칭키 알고리즘보다 키의 길이를 2배로 하는 것이다.

다음은 NIST에서 제공하는 해시 알고리즘의 보안 강도를 확인가능한 표이고 표안의 숫자들은 키의 길이의 비트수를 나타낸다. 해시함수에서 키 길이는 해시 값(Hash value)의 길이를 뜻한다.











만약 충돌 저항성이 문제인 환경에서는 충돌 저항성 보안성을 기준으로 키 길이가 더 길어야 한다. 반대로 역상 저항성만 문제라면 충돌 저항성이 문제일 때보다 키 길이가 조금 짧아도 안정성을 유지할 수있다.
예를 들어 단일 해시 함수와 전자서명용 해시 함수는 특정 hash value를 공유하는 두 값이 있을 때는 사용자를 정확하게 인증 할 수 없다. 그래서 충돌 저항성이 문제가 되므로 키 길이가 길어야 한다.

반면에 다음 세가지 용도로 쓰이는 Hash function(HASH(B) 유형)은 충돌 저항성보다 역상 저항성이나 다른 조건에 따라 안전성이 좌우된다.

  • HMAC(Hash-based Message Authentication Code)
  • 키 유도 함수(Key derivation Function)
  • 난수 발생(Random Number Generation

HMAC은 원본 데이터에 특정값을 더해 함께 해시하는 키 기반 해시(Keyed Hash)이기때문에 해시 함수만 수행할 때보다 더 높은 안정성을 확보할 수 있다. 키 기반 해시는 난수 형태인 비밀 값을 키 값으로 사용한다.  안정성 확보 말고도 자신이 생성했음을 인증하려는 목적에서 키를 추가하여 해시하기도 한다. 키를 추가하면 역상 저항성이 높아져 원본 데이터를 알아내기 어렵다. 충돌 저항성의 관점에서 같은 해시 값을 생성하는 원본 데이터를 노출해도 키(해시 값)를 제외한 부분은 알수 없으므로 다른 서비스 까지 위험하지는 않다.
키 유도 함수는 키 기반 해시에 필요한 키 값을 만드는 키생성기 로 난수 생성기라고 봐도 무관하다. 키 유도함수는 키를 생성하는 입력 값의 안정성과 해시함수의 역상 저항성에 따라 보안 강도가 달라진다.

0 개의 댓글:

댓글 쓰기