-
해시란
프로그래밍 기초 공부
2022. 12. 4. 16:40
해시
- 단방향 암호화 기법
- 암호화는 수행하지만 복호화는 불가능한 알고리즘
- 해시함수를 이용하여 고정된 길이의 비트열로 변경
- key와 실제 데이터의 값(value)이 한 쌍으로 존재
- key값이 배열의 인덱스로 변환되기 때문에 검색과 저장의 평균적인 시간 복잡도가 O(1)
- 해시를 만들기 위해선 해시함수가 필요
해시함수
- 해시함수는 해시를 만드는 함수
- 임의의 길이의 데이터를 고정된 길이의 데이터를 출력하는 함수
- 다른 말로 체크섬(checksum)
- 매핑 전 원래 데이터의 값을 키, 매핑 후 데이터의 값을 해시값, 매핑하는 과정을 해싱
해시함수의 특징
- 입력값이 일부만 변경되어도 전혀 다른 해시값을 출력
- 입력값 상관없이 고정된 길이의 해시값을 출
- 복호화 불가능
- 복잡하지 않은 알고리즘으로 구현되기 때문에 상대적으로 CPU, 메모리 같은 시스템 자원을 덜 소모
- 같은 입력값에 대해서는 같은 출력값을 보장
해시함수 사용 이유
해시함수의 가장 큰 특징은 입력값이 일부만 변경되어도 전혀 다른 값을 출력한다는 것
이러한 특징으로 인하여 해시함수를 사용하는 목적은 메시지의 오류나 변조를 탐지할 수 있는 무결성
ex) 블록체인, 그 외에 비밀번호, 전자서명, 전자투표, 전자상거래 등에 사용
해시 함수의 문제점
인식 가능성(recognizability)
- 입력값이 같으면 출력값이 같다는 성질 때문에 비밀번호가 같은 유저라면 모두 해킹 가능성이 있음
- 또한 해커들은 미리 레인보우 테이블을 만들어 두기 때문에 비밀번호를 해킹하면 이를 레인보우 테이블에서 비교 대조하여 원래의 비밀번호를 알아낼 수 있음
- 레인보우 테이블 : 입력값과 해시값을 연결해놓은 테이블
속도
- 해시 함수의 처리 속도가 빠르기 때문에 무차별 대입 공격을 당할 수 있다.
- 고성능의 GPU 등을 이용해서 무차별적으로 해시 함수를 대입해보면 1초에 약 50억번 이상 대입이 가능하기 때문에 대입하다보면 뚫을 수도 있다는 것
문제점 해결방안
솔트(Salt)
- 일종의 랜덤 텍스트
- 사용하는 주된 목적은 비밀번호에 솔트를 섞은 후 함께 해시하여 레인보우 테이블 자체를 무의미하게 만드는 것
- 즉, 해커가 해시값을 알아내어도 레인보우 테이블에서 일치하는 비밀번호를 찾기 어려워지며 유저들의 비밀번호가
- 같더라도 부여되는 솔트 값은 다르기 때문에 해시값도 달라지게 됨
- 솔트는 최소 128bit 정도는 되어야 안전
키 스트레칭(Key Stretching)
- 해시 함수를 여러 번 반복하여 강제적으로 1회 대입에 걸리는 시간을 높이는 방법
- 대입에 걸리는 시간이 조금만 길어져도 50억 번 이상 시도하기 위해서는 어마무시한 시간이 걸리기 때문에 해커들이시도조차 하지 않음
- 또한 보통 유저들은 비밀번호를 간단하게 혹은 예측하기 쉽게 만드는 경우가 많은데 이 방법을 사용하면 더 예측하기 어렵게 만들어 진다.