[보안] 해시함수와 메시지 다이제스트
해시 함수(Hash Function)
임의의 길이의 입력에 대해 그 입력을 대표하는 메시지 다이제스트(Message Digest)라고 하는 고정 길이의 값을 출력하는 함수
SHA(Secure Hash Algorithm; 해시 암호 알고리즘)
해시 함수에는 다양한 알고리즘이 있음
충돌 위험성이 적은 순으로 대표적인 알고리즘을 정렬하자면 "SHA-256 > SHA-1 > MD5", 따라서 SHA-256 사용이 권장
무한이라고 할 수 있는 입력값을 유한한 출력값(하지만 범위는 넓음)으로 변환하기 떄문에 원리적으로 결과가 충돌할 가능성이 0은 아님, 하지만 한 없이 낮도록 고안된 것
특징
1. 입력 정보가 조금이라도 바뀌면 결과가 크게 달라짐
123456789 > SHA-1 > f7c3bc1d808e05732adf679965ccc34ca7ae3441
123455789 > SHA-1 > 799e21369c0bc0115ac2c2edcf4989989bc9b010
2. 메시지 다이제스트의 충돌(collision)이 일어날 가능성이 매우 낮음
- 0는 아니라 매우 낮은 것임을 유의할 것
메시지 다이제스트의 충돌(collision) - 다른 입력에 대해 같은 메시지가 출력되는 상태
/* 충돌 - 메시지는 다른데 출력이 동일 */
메시지1 > SHA-1 > dc0ef49d62e8a2039d1b2kd8rj2d859dikfjdasf
메시지2 > SHA-1 > dc0ef49d62e8a2039d1b2kd8rj2d859dikfjdasf
3. 메시지 다이제스트를 통해 원래의 입력값을 추측하기가 어려움(= 해시 함수의 단방향성)
- 메시지 다이제스트에서 원래의 정보를 역산하기는 거의 불가능함
해시 함수와 웹 애플리케이션의 보안의 관계
1. 정보 조작의 발견
가장 많이 이용
예) 인터넷을 통해 어떤 파일을 송수신하는 경우, 보내는 사람이 파일 전체의 메시지 다이제스트를 생성해 파일과 별도로 수신자에게 보내게 되면, 받는 사람이 받은 파일의 메시지 다이제스트를 계산하여 받은 메시지 다이제스트와 같은지 비교하여 파일이 변질되었는지 발견할 수 있음
2. 추측 불가능한 문자열의 생성
두 번째로 많이 이용
해시 함수의 일방향성을 이용해 추측 불가능한 문자열을 작성하는 것
크로스 사이트 요청 위조의 일회용 토큰을 생성할 때도 해당 해시 함수를 이용할 수 있음
- 난수를 이용해 일회성 토큰을 생성하는 경우, 이전과 같은 값이 생성될 가능성이 있음
- 일정한 수라도, 해시 함수를 이용해 암호화하면 쉽게 추측할 수 없게 값이 어려워짐
3. 패스워드의 저장
패스워드를 해시 함수를 이용해 저장해둘 경우, DB 데이터가 유출되더라도 패스워드를 유추하기 쉽지 않음
로그인 화면에서 패스워드의 메시지 다이제스트를 계산한 후 DB와 비교하면 됨
요즘에는 레인보우 크랙(Rainbow Crack)이라는 수법이 발달해, 패스워드처럼 문자의 수와 종류가 제한된 경우엔 메시지 다이제스트에서 원래의 문자열을 단시간에 추측할 수 있게 됨
- 권장 방법 : 패스워드 뿐만 아니라 아이디까지 포함하여 원래의 문자열을 길게 만들어 레인보우 크랙에 대한 내성을 높이는 방법이 권장됨(본래의 교환 대상에 추가되는 문자열을 솔트(salt)라고 함 - 여기서는 사용자 아이디)