SHA256 해시 값을 저장하는 방식 이해하기

비밀번호를 난독화하는 방법이 여러 가지 있습니다. 그중 대표적인 방법이 해싱(Hashing)입니다. 해싱은 특정 데이터를 고정된 크기의 고유한 값으로 변환하는 과정입니다. 해시 함수인 SHA256 등의 알고리즘이 이 작업을 수행합니다.

 

SHA256 알고리즘을 이용해서 비밀번호를 해시하면 결과 값은 0과 1로 이루어진 바이너리 데이터입니다. 바이너리를 DB에 그대로 저장할 수는 없습니다. 사람이 읽고 활용할 수 있는 형태가 아니기 때문입니다. 그래서 이 결과를 저장하거나 전송하기 위해 사람이 읽을 수 있는 문자열 형태로 변환하는 과정이 필요한데, 이를 인코딩(encoding)이라고 합니다.

 

해시된 값을 사람이 읽을 수 있는 형태로 변환하기 위해 주로 Hexadecimal 인코딩과 Base64 인코딩이 사용됩니다.

SHA256 해시 값 인코딩

Hexadecimal 인코딩은 바이너리 데이터를 16진수 문자열로 변환하는 방식이고, Base64 인코딩은 바이너리 데이터를 64가지 문자로 이루어진 문자열로 변환하는 방식입니다. 둘 다 바이너리 데이터를 문자열 형태로 변환하는 방법이지만, 사용하는 문자의 집합과 결과 문자열의 길이에 차이가 있습니다.

1. Hexadecimal (16진수) 인코딩

Hex 인코딩은 각 바이트를 16진수 두 글자로 변환합니다. 예를 들어, 바이트 값 255는 16진수로 FF가 됩니다. 따라서 SHA-256 해시 (256비트 또는 32바이트)를 16진수로 인코딩하면 항상 64자의 문자열이 됩니다. Hex 인코딩은 0-9 및 A-F의 문자만 사용합니다.

 

만약 "1234"라는 텍스트를 SHA-256으로 해시한 결과를 Hex 인코딩하면 아래와 같은 값을 얻을 수 있습니다. 참고로 hex 인코딩은 알파벳을 소문자로 인코딩하는 것과 대문자로 인코딩하는 것의 차이도 존재합니다.

03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4

 

2. Base64 인코딩

Base64 인코딩은 각 바이트를 64가지 가능한 문자 중 하나로 변환합니다. 따라서, 3바이트는 항상 4자의 Base64 문자열이 됩니다. SHA-256 해시를 Base64로 인코딩하면 대략 44자의 문자열이 됩니다. Base64 인코딩은 hex 대비 더 짧으며, 더 큰 문자 집합 (A-Z, a-z, 0-9, +, /, =)을 사용합니다.

 

위와 마찬가지로 "1234"라는 텍스트를 SHA-256으로 해시한 동일한 결과에 대해 Base64 인코딩을 하게 되면 아래와 같은 값을 얻을 수 있습니다.

A6xnIhbz4Vx2HuGl4lXwZ5U2I8iziLRFnhP5eNfIRvQ=

 

인코딩 방식이 중요한 이유

위 "1234" 예시처럼 같은 알고리즘으로 해싱하더라도 최종 저장되는 결과 값은 인코딩 방식에 따라 달라집니다. 이러한 이해가 있어야 로그인 인증처럼 해시 값을 이용한 문제가 발생했을 때 원인을 파악할 수가 있습니다.

 

예를 들어, 사용자가 1234라는 비밀번호로 계정을 생성했고 해당 값이 패스워드 컬럼에 저장될 때 SHA256 해싱 후 Base64 인코딩 됐습니다. 그런데 로그인 시엔 Hex 값을 기준으로 인증처리를 한다면, 사용자는 분명 1234를 정상적으로 입력했더라도 인증에 실패하게 되는 것입니다.

반응형

댓글

Designed by JB FACTORY