해시 함수

옥영진·2020년 10월 17일
0

해시 함수란

해시 함수는 어떠한 입력값을 고정된 길이의 해시 값으로 변경하는 함수를 말한다. 문자나 숫자 등 모든 형태의 입력값을 해시 값이라고 하는 바이너리 형태의 값으로 변환한다. 해시 값의 특징으로 다음과 같다.

  • 입력값이 같으면 반환되는 해시 값도 동일함.
  • 해시 값의 길이는 입력값의 길이에 상관없이 항상 일정함.
  • 서로 다른 입력값이 동일한 해시 값을 만들 확률은 낮음.

안전한 해시 함수로는 다음과 같은 조건을 만족해야 한다.

  • 해시 값을 통해 입력값으로 복원할 수 없어야 함.
  • 서로 다른 입력값으로 같거나 비슷한 해시 값을 찾을 수 없어야 함.

해시 함수를 사용하여 얻을 수 있는 대표적인 기능으로 다음과 같은 것이 있다.

  • 패스워드 검증과 같이 입력값이 이전에 저장해 놓은 값과 같은지 비교할 수 있음.
  • 해시 값을 비교하여 데이터가 변하지 않았다는 무결성 검증을 할 수 있음.

해시 함수 종류

MD5

MD5(Message-Digest Algorithm5)는 1990년대부터 사용해온 알고리즘으로, 서로 다른 두 입력값으로 이 해시 함수를 통해 해싱하면 같은 해시 값이 나올 수 있다는 사실(해시 충돌)이 알려져 거의 사용되지 않고 있다.

SHA-1

SHA-1(Secure Hash Algorithm-1)은 최대 2^64비트 데이터를 입력값으로 사용할 수 있고, 고정된 160비트의 해시 값을 생성한다. 이 해시 함수 역시 MD5와 마찬가지로 해시 충돌 방법이 발견되었기에 거의 사용되지 않지만, 암호학적으로 안전하지 않아도 되는 곳에서 사용되기도 한다.

SHA-2

SHA-2(Secure Hash Algorithm-2)는 SHA-224, SHA-256, SHA-512 등 여러 해시 함수를 지칭한다. SHA-1의 취약점이 발견된 이후로 가장 많이 사용하는 해시 함수이다. 물론 안전할 수록 해시 값을 생서하는데 걸리는 시간은 더 오래 걸린다.

해시 함수 사용 예

패스워드와 같은 민감한 데이터 저장

위에서 안전한 해시 함수의 특징을 설명했었다. 이를 통해 해시 함수를 사용하면 패스워드와 같은 민감한 정보들을 안전하게 저장할 수 있다. 물론 해시 함수를 통해 해시 값을 반환하는 비용이 커, 브루트포스 공격이나 DDOS 공격으로 인해 서버가 다운될 수 있으므로, 짧은 시간 내에 일정 횟수 이상의 요청을 보낼 경우, 별도의 조치를 취할 필요가 있다.
패스워드를 해싱할 때는 패스워드 그대로 해싱하지 않고, 솔트(Salt)라는 값을 문자열에 더한 후에 해싱하는 방법을 주로 사용한다.

솔트(Salt) 값을 사용하지 않을 경우

솔트 값을 사용하지 않는 서비스를 해킹하여 해시 값이 유출될 경우 다음과 같은 문제점이 발생할 수 있다.

  • 입력값이 같으면 해시 값도 같기 때문에 이를 이용해 원래 비밀번호를 유추할 수 있음.
  • 솔트 값을 사용하지 않는 다른 웹 서비스에서 같은 해시 값을 사용할 수 있는 문제점이 있음.

바이너리 데이터 무결성 검증

해시 값이 고유하다는 특징을 이용해 바이너리 데이터로부터 고유한 식별자를 만들 때 해시 함수를 사용하기 좋다. 해시 값만 비교하여 중복 데이터인지 검사하거나, 파일의 무결성을 검사할 수 있다. 이 때는 암호학적으로 민감하지 않되 성능이 빠른 해시 함수를 사용하는 것이 좋다.

해시 값을 키로 사용

데이터의 크기가 크다면 성능을 중요시 하되 충돌 가능성이 낮은 해시 함수를 사용하는 것이 좋다. 또한 항상 충돌 가능성을 염두에 두고 충돌을 해결할 수 있도록 조치해야 한다.

profile
안녕하세요 함께 공부합시다

0개의 댓글