ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11/7 TIL | 해시 함수(Hash Function)
    📝 기록/매일의 기록 2022. 11. 7. 18:51

    해시 함수는 지난주에 읽었던 읽고 있는 암호화 서적에서 접하게 되어 지난번 암호화 방식 TIL에서 하지 못했던 해시 암호화 방식을 포함해서 해시 함수에 대해 정리해보려고 한다!


    우선 해시 함수(짧게는 그냥 해시)는 임의의 길이를 갖는 임의의 데이터를 고정된 길이의 데이터로 매핑하는 단방향 함수를 말한다. 즉, 아무리 큰 숫자를 넣더라도 정해진 크기의 숫자가 나오는 함수이다. 해수 함수에 대해서 알아둬야 할 특징은 아래와 같이 3가지가 있다.

    1. 해시 함수는 동일한 입력값(input)에 대한 동일한 출력 값(output)을 갖고 있다.
      => 즉, 입력값이 바뀌지 않으면 출력값도 바뀌지 않는다.

    2. 입력값이 하나만 변경되어도 이에 대한 출력값은 완전히 달라진다.(쇄도 효과)

    3. 항상 같은 방향, 즉 한방향으로만 움직인다.
      => 즉, 출력값에서 입력값을 얻을 수 없다.

    또한 해시 함수가 가지고 있는 세 가지 특성은 아래와 같다.

    1. 역상 저항성(Preimage Resistance)
    - 해시 값이 주어졌을 때, 그 해시 값을 생성하는 입력 값을 알아내기가 불가능하다는 특성이다.
    -
    즉, 주어진 해시 값 H가 있다면 그 해시 값을 생성하는 (H = Hash(M)) M을 계산하기가 어려워야 한다는 것이다.

    2. 제2 역상 저항성(Second Preimage Resistance)
    -
    어떤 입력 값과 동일한 해시 값(결과 값)을 가지는 다른 입력 값을 찾을 수 없어야 한다는 특성이다.
    - 즉
    , 어떤 입력 값 M1에 대해 M1 =/= M2이며, Hash(M1) = Hash(M2)인 M2를 찾기 어려워야 한다.

    3. 충돌 저항성(Collision Resistance)
    - 해시 값(결과 값)이 같은 입력 값 두 개를 찾을 수 없다는 특성이다.
    - 역상 저항성과 비슷해보이지만, 충돌 저항성은 해시 값이 무엇이든(그 값을 알든 모르든) 특정하게 같은 해시 값을 생성하는 값 두 개를 찾는 과정이 문제이고, 역상 저항성은 해시 값을 알고 있을 때 원래 값을 찾아내는 것이 문제이다.

    다만 이 해시 함수는 레인보우 테이블에 취약하다. 레인보우 테이블은 해시 함수(MD5, SHA-1, SHA-2 등)을 사용하여 만들어낼 있는 값들이 저장되어 있는 표이다. 앞서 말했듯이 해시 함수는 동일한 입력값은 계속 똑같은 출력 값을 반환하기 때문에 원래의 값을 구하려는 해시 값과 매핑을 하여 원래의 입력 값을 유추해 있다. 방법으로 입력 값을 유추하는 것을 복호화라기보다는, 크랙에 가까운 개념이라 있다.

    이러한 공격을 방지하기 위해 나온 것이 salt 기술을 병합하는 것이다. 기존에는 패스워드만 해시함수에 통과시켰으나 최근에는 가입 시간이나 난수를 비밀번호와 같이 해시값에 포함시킨다. 이때 추가적으로 포함된 가입 시간이나 난수를 솔트(salt)라고 한다. 이는 서로 다른 계정이 같은 비밀번호를 사용하더라고 솔트가 다르면 완전 다른 해시값이 생성되며, 설령 같은 해시값을 같더라 하여도 솔트 값이 전혀 다르기 때문에 평문을 유추하기 힘들다는 논리다. 일방향성이 아닌 암호화/역암호화 시 둘 다 사용되는(쌍으로 이루어지는) 솔트는, 같은 솔트가 사용되어야 하고 레인보우 테이블에 의한 암호 크랙 공격(사전 공격)을 어느 정도 무력화시킬 수 있다.