본문 바로가기

기타

암호화에서 해시(hash)란 무엇인가?

해시(hash) 란 무엇인가?

해시란 원형문자(plaintext)가 해시함수(해시 엔진)를 통과하여 암호화되어 나온 결과물을 뜻한다. 그리고 해시함수(해시엔진)를 통과하는 과정을 해싱(hashing)이라고 한다.

13 곱하기 29 가 무엇인지 누가 물으면 377이라는 것을 금방 알 수 있다.  하지만 반대로 몇과 몇을 곱하면 377이 나오냐라고 물어보면 무수히 많은 경우의 수가 있다.  이것이 해싱의 기본원리이다. 

실제 사용자가 입력한 비밀번호가 해시함수를 통과하여 해시가 된다. 이 해시의 원형을 알아 내려면 많은 경우의 수가 필요하여 복호화(암호해독)가 어렵다. 이것이 해싱을 통한 비밀번호 암호와의 기본원리이다.

다만 해싱에도 단점이 있는데 비밀번호가 같으면 해시가 무조건 같다.

예를들어 md5라는 해시 엔진을 통과한 12345라는 비밀번호의 hash는 무조건 "827ccb0eea8a706c4c34a16891f84e7b" 이다. 즉 plaintext(원형문자)가 같으면 해시도 같다

그래서 12345, abcdefg와 같이 많은 사람들이 사용하는 비밀번호를 사용하지 말라고 강조하는 것이다. 해싱의 단점을 보완하기 위하여 플레인 텍스트에 랜덤의 문자열을 더 해준 뒤(salting) 해싱을 한다. 그리고 해싱을 한 번만 하는 것이 아니라 반복해서 여러 번 하여 더 해독이 어려운 결과물을 만들어 낸다. 대표적으로 노드 js의 bcrypt라는 모듈이 있다.