SHA256 해시 값을 저장하는 방식 이해하기
- IT
- 2023. 6. 9.
비밀번호를 난독화하는 방법이 여러 가지 있습니다. 그중 대표적인 방법이 해싱(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를 정상적으로 입력했더라도 인증에 실패하게 되는 것입니다.
'IT' 카테고리의 다른 글
Session과 Token 로그인 인증 차이 (0) | 2023.06.11 |
---|---|
데이터 웨어하우스(DW)란? 통합 분석 (0) | 2023.06.10 |
앱 연동 관점에서 URL SCHEME이란? (0) | 2023.06.07 |
애플리케이션 서버 설정 값 properties와 config (0) | 2023.06.06 |
삼성페이 카드 등록하는 방법 (교통카드 추가) (0) | 2023.06.06 |