궁금한 내용은 바로 알아보기!

[모호하면 바로] 해시함수가 머야? 인코딩이랑의 차이는?

Don't stop 훈 2024. 9. 18. 18:02

 

배경

질문 듣고 가슴이 두근 거렸다.. 공부하자

나 왜 이거 대답 못해..? 쭈글..

 

 

해시함수 vs 인코딩

인코딩은 다른 방식으로 표현하는 것이다.

반대로 다른 문자로 표현된 것을 다시 디코딩을 통해 원래 문자로 되돌릴 수 있다.

 

반면에 해시함수는 한번 함수를 거쳐 변환되면 다시 되돌릴 수 없는 단방향 함수이다.

그리고 변환된 값은 고정된 길이를 갖는다. 여기서 큰 차이가 있네!

 

그래서 해시함수는 무결성 검증이나 데이터를 빠르게 검색할 때 사용된다.

 

 

해시 알고리즘

해시함수가 연산하는 방법을 해시 알고리즘 이라고 한다.

대표적으로 SHA-1, SHA-256, SHA-512, HMAC 등이 있다.

 

JWT 토큰인증을 프로젝트에 적용할 때에도 해시 함수를 사용했었다.

출처 : 이것이 컴퓨터 공학이다.

 

 

 

 

무결성 검증 방식

이걸로 어떻게 데이터 무결성을 검증할까? 잘 와닿지 않아서 한번 알아보려고 한다.

 

A가 B에게 데이터를 전달하고, 해시함수를 통해 변환된 해시값도 전달한다.

B는 받은 데이터를 해시함수를 통해 변환해서 받은 해시값과 비교할 수 있다.

 

비밀번호 저장에도 단방향 암호화(해시 함수 적용) 방식이 사용되는데, 우리 프로젝트에서도 대표적으로 bcrypt를 사용했다.

인증을 할 때 해시 함수를 사용하는 단방향 암호화 방식을 통해 비교할 수 있다.(당연히 반대로 실제 비밀번호로 되돌릴 순 없다 단방향이니까!)

 

 

Java의 해시 충돌 해결방식?

해시 함수를 사용해도 충돌이 발생할 수 있다.

대표적으로 아래와 같은 사례가 있다.

출처 : 이것이 컴퓨터 공학이다

 

 

Java에는 대표적으로 HashTable과 HashMap이라는 구현체가 존재하는데, 해시 충돌을 어떻게 해결하고 있을까?

 

JDK7 이하에서는 링크드리스트를 이용한 chainning 방식을 사용했다고 하는데, JDK8 이상부터는 특정 중복 키-값 쌍 이상의 데이터가 쌓이면 RedBlackTree형태로 값을 보관한다고 한다.

(자세한 사항은 코드를 뜯어(?)보면서 공부해보면 좋은 경험이 될 것 같다)