[인터넷 보안] Hash에 대해 외울 것들

Robert.Yang·2023년 6월 17일

Security

목록 보기
2/9
post-thumbnail

이 포스트는 널널한 개발자님 강의를 참조하여 작성하였습니다.

Hash에 대해 외울 것들

Hash(함수)의 특징

  • 단방향성
  • 입력 값의 크기와 상관없이 결과 값의 길이(혹은 크기)가 일정
  • 데이터 무결성 확보와 관련해 IT기술 전반에서 사용된다.

해시에 대해 이야기할 때 가장 중요한 특징이 단방향성이다. 함수 f가 있고 매개변수 x가 있는데 그 결과 값이 y인 함수를 해시라고 볼 수 있다. 예를 들어 매개변수 x에다각 어떤 값 7을 집어 넣고 그 결과 y값이 2라고 한다 하자. 그럼 이 함수의 로직이 예를 들어 x-5라고 한다면 결과값 y로 x값을 추론할 수 있을 것이다. 그런데 일반적으로 해시는 이렇지 않고 좀 더 복잡한 로직으로 가는데 예를들면 나머지 연산으로 로직을 작성한다고 볼 수 있다. 만약에 로직이 x%5인 경우라면 y값으로 x값을 추론할 수 없을 것이다. 왜냐하면 나눴을 때 나머지 값이 2인 수는 굉장히 많기 때문이다. 그래서 이런 나머지 연산을 해버리는 순간 원본값을 알기가 힘들다.

그래서 해시함수에 대해서 가장 중요한 특징이 단방향성인데 여기서 추가적으로 알아야 할 것이 길이 혹은 크기가 일정하다는 개념이다. 예를 들어 5로 나눴을 때 나머지를 구하는 로직의 경우 y값은 0~4까지 즉, 5가지 경우의 수밖에 나오지 못한다. 그러니까 값의 크기라는게 이런 범위로 특정되버린다. 즉, 나머지 연산을 수행하게 되면 경우의 수를 나누어주는 수의 범위로 제한되는 특징이 있다. 이게 암호학에서 굉장히 중요하게 생각된다. 그래서 암호학이 나오면 제일 중요한게 나머지 연산과 난수이다.

💡 참고
난수란 random number로 어떤 숫자를 우연으로 뽑아내는 것을 말한다.

해시 함수는 위와 같은 특징을 가지고 있는데 이걸 이용해서 어디에 사용되냐면 데이터 무결성을 확보하는데 사용된다. 그런 의미에서 해시는 checksum과 급이 다르다. 실제로 checksum의 할 일을 해시가 대체하기도 한다. 그 대신 해시를 쓴다고 하면 조금 복잡해지고 연산이 많아지니까 효율이 떨어지겠지만 checksum에 비해서 조금 완벽하다. 그래서 실제로 해시 함수가 도처해서 사용된다.

대표적인 hash 알고리즘

  • MD-5: 패스워드 단방향 암호화에 사용금지
  • SHA-1
  • SHA-128, SHA-256, SHA-384, SHA-512

해시를 사용하는 방법이 위에서 이야기 했듯이 어떤수로 나눠서 나머지를 구하는 로직과 유사하다. 그리고 나머지로 x값을 찾을 수 없다라고 했는데 과연 이렇게만 해시가 로직을 작성할까? 그리고 나머지 값은 나누는 수의 범위라고 했는데 기본적으로 해시는 이 범위가 굉장히 넓어야 하며 겹치는 수는 존재해서는 안된다. 그래야 좋은 해시 알고리즘이라고 볼 수 있다. 그러니까 원본 데이터가 달라지면 결과도 항상 달라져야 한다. 그래서 해시 알로리즘 중에서 가장 대표적인 계열이 MD계열과 SHA계열 2가지가 있는데 이에 대해 좀 살펴보겠다. MD계열중 MD-5는 경우의 수가 되게 적어서 패스워드 암호화에 사용되서는 안된다. 그리고 MD든 SHA든 뒤의 숫자가 높을 수록 좋은 알고리즘이다. 즉, 뒤의 숫자는 나누는 수의 범위라고 보면 좋을 것이다. 그래서 충돌가능성은 적고 그만큼 보안성이 뛰어나다. 그러면 이 알고리즘에 대해 좀 더 살펴보겠다.

MD-5 해시결과

위의 그림은 실제로 MD-5 해시결과인데 예를들어 "TestString"이라는 문자열이 있다 하자. 이것을 MD-5 알고리즘으로 hashing 했을 때 결과가 Mr...로 나오는 걸 볼 수 있다. 그럼 위의 그림을 통해 무엇을 이야기하는 것이냐면 해시함수를 하면 짧든 길든 길이가 일정하다는 것이다.

위에서 MD-5로 패스워드 암호화를 하지 말라고 했다. 그 이유를 알기 전에 우리가 알아야 할 것이 있는데 바로 다음과 같다. 우리가 기본적으로 사용자를 인증할 경우가 많을 것이다. 사용자를 인증하는 기법에는 되게 여러가지 기법이 있다.

💡 참고
사용자 인증 기법
1. 소지기반: 키 값으로 인증하는 기법
2. 지식기반: 비밀번호를 어느 저장소에 저장해놓고 암기하듯이 이 저장소를 통해 인증하는 기법
3. 생체기반: 지문인식, 홍체인식같은 것으로 인증하는 기법
4. 위치기반: 사용자의 위치를 근거로 인증하는 기법

사용자를 인증하는 기법중에 가장 많이 사용되는 기법이 가성비가 뛰어난 인증체계인 지식기반이다. 우리가 보통 회원가입을 할 때 id를 만들고 비밀번호를 선택을 하는데 이 회원가입을 받은 어떤 웹페이지가 있다고 가정하자. 이때 id를 test라고 하고 비밀번호를 1234라고 하자. 그럼 웹페이지는 이걸 인증하기 위해 사용자 비밀번호를 DB에 저장할 것이다. 그런데 문제가 비밀번호를 평문으로 DB에 저장을 하면 어떻게 될까? 악의적인 의도를 가진 운영자가 해킹을 할 수도 있을 것이고 해커가 DB를 탈취하여 해킹이 가능해질 것이다. 즉, 이런 경우를 대비해서 비밀번호를 평문으로 절대 저장하지 않고 암호화시켜서 저장을 한다. 그런데 그때 암호화를 무조건 단방향 암호화를 진행하는 것이다. 즉, 비밀번호가 "TestString"이라고 한다면 DB에는 Mr...로 저장이 될 것이다.

그러면 이렇게 단방향으로 DB에다가 해시결과를 저장하는 방식으로 비밀번호를 저장하면 완벽히 보호가 되었다고 할 수 있을까? 예를 들어보자. 비밀번호를 1234로 저장한 사용자가 있다고 하자. 그러면 DB에는 hash연산을 해서 저장되었을 것이다. 그런데 이 DB가 해커에 의해 탈취되었다고 하자. 그러면 해커는 이 해시값으로 복원이 안되니 어떤 프로그램을 개발해서 그 프로그램으로 패스워드에 쓸 수 있는 문자열을 만들고 해시를 해서 DB결과와 같은지 조사를 할 것이다. 그리고 같은게 있으면 원본 비밀번호를 추론이 가능해진다. 이게 해시가 가지고 있는 문제점인데 그래서 MD-5를 가지고 패스워드 단방향 암호화하면 안된다는게 길이가 매우 짧기 때문이다. 또한 위의 사태를 방지하기 위해 보통 회원가입할때 특수문자 + 영한문자 + 숫자로 8자이상으로 제한을 두는것도 이 이유에서이다. 그래서 패스워드 암호화할때는 MD-5보단 SHA-256방식을 많이 사용한다.

위의 문제점으로 인해 MD-5방식을 안 쓰지만 굳이 사용해야 한다면 이런 방식을 많이 취한다. 패스워드에 SALT값을 집어넣고 해시연산을 한다. 그런데 이 SALT값은 내부자들 즉, 개발자들만 알 수 있는 값이다. 예를 들어 어떤 사람이 비밀번호를 1234로 했다고 하면 SALT값으로 비밀번호 앞뒤에다가 TEST__!같은 정해진 문자열을 넣어서 문자열 값을 늘린다. 이렇게 되면 경우의 수가 증가해서 DB가 탈취된다 하더라도 원본 비밀번호를 알기 힘들것이고 어떻게 해서 원본 비밀번호를 알아낸다 해도 SALT값이 포함되어 있어 어느게 진짜 원본 비밀번호인지 알기 힘들 것이다.

대표적인 hash 기술 활용 예

  • 무결성 확보
    • 인증서 검증
    • 디지털 포렌식
    • 디지털 서명 (hash + PKI)
  • 패스워드 단방향 암호화
  • 블록체인

그래서 해시기술이 사용되는 예는 굉장히 많은데 일단 기본적으로 무결성을 확보하는데 쓰이고 패스워드 단방향 암호화에도 쓰인다. 그리고 무결성 확보는 우리가 향후 배울 인증서, 즉 공인인증서같은것을 검증할 때 쓰인다. 그 다음 디지털 포렌식과 디지털 서명을 할 때도 사용된다.

💡 참고
서명이란, 해시와 PKI가 합쳐진 형태이다.

그기로 블록체인이라는 기술에도 사용된다. 어떤 정보가 있으면 이 정보를 해시연산한 블록을 어느 정보에 집어 넣어서 그것을 기반으로 또 해시 연산을 한다. 또 이 블록을 어느 정보에 넣고 이 과정을 반복하는 기술이 블록체인기술이다. 이렇게 되면 블록이 10,000개가 있다고 하면 이중에 어느 블록을 변조할려면 그 전에 해시한 블록을을 다 조작해야 함으로 변조가 불가능한 기술이다.

profile
모든 것을 즐길 줄 아는 개발자, 양성빈입니다.

0개의 댓글