배경
질문 듣고 가슴이 두근 거렸다.. 공부하자
나 왜 이거 대답 못해..? 쭈글..
해시함수 vs 인코딩
인코딩은 다른 방식으로 표현하는 것이다.
반대로 다른 문자로 표현된 것을 다시 디코딩을 통해 원래 문자로 되돌릴 수 있다.
반면에 해시함수는 한번 함수를 거쳐 변환되면 다시 되돌릴 수 없는 단방향 함수이다.
그리고 변환된 값은 고정된 길이를 갖는다. 여기서 큰 차이가 있네!
그래서 해시함수는 무결성 검증이나 데이터를 빠르게 검색할 때 사용된다.
해시 알고리즘
해시함수가 연산하는 방법을 해시 알고리즘 이라고 한다.
대표적으로 SHA-1, SHA-256, SHA-512, HMAC 등이 있다.
JWT 토큰인증을 프로젝트에 적용할 때에도 해시 함수를 사용했었다.
무결성 검증 방식
이걸로 어떻게 데이터 무결성을 검증할까? 잘 와닿지 않아서 한번 알아보려고 한다.
A가 B에게 데이터를 전달하고, 해시함수를 통해 변환된 해시값도 전달한다.
B는 받은 데이터를 해시함수를 통해 변환해서 받은 해시값과 비교할 수 있다.
비밀번호 저장에도 단방향 암호화(해시 함수 적용) 방식이 사용되는데, 우리 프로젝트에서도 대표적으로 bcrypt를 사용했다.
인증을 할 때 해시 함수를 사용하는 단방향 암호화 방식을 통해 비교할 수 있다.(당연히 반대로 실제 비밀번호로 되돌릴 순 없다 단방향이니까!)
Java의 해시 충돌 해결방식?
해시 함수를 사용해도 충돌이 발생할 수 있다.
대표적으로 아래와 같은 사례가 있다.
Java에는 대표적으로 HashTable과 HashMap이라는 구현체가 존재하는데, 해시 충돌을 어떻게 해결하고 있을까?
JDK7 이하에서는 링크드리스트를 이용한 chainning 방식을 사용했다고 하는데, JDK8 이상부터는 특정 중복 키-값 쌍 이상의 데이터가 쌓이면 RedBlackTree형태로 값을 보관한다고 한다.
(자세한 사항은 코드를 뜯어(?)보면서 공부해보면 좋은 경험이 될 것 같다)
'궁금한 내용은 바로 알아보기!' 카테고리의 다른 글
[모호하면 바로] Nginx는 어디에 사용되는걸까? (1) | 2024.10.14 |
---|---|
[모호하면 바로] HTTP Method의 Patch 동작방식? (0) | 2024.09.21 |
[모호하면 바로] JWT(토큰)의 보안 취약점과 해결 방법? (0) | 2024.09.18 |
[모호하면 바로] 인덱스가 왜 B트리를 사용할까? (0) | 2024.09.18 |
[모호하면 바로] CORS 알아보기 (0) | 2024.09.18 |