SHA256 해시 결과가 달라요?

주싱·2023년 10월 4일
0

Trouble Shooting

목록 보기
21/21

서비스에서 생성한 해시(SHA256) 계산 결과와 다른 범용 도구를 활용한 결과가 다르다는 컴플레인이 들어왔습니다. 원인을 분석해 보니 사람이 보기에는 똑같은 값이지만 컴퓨터가 값을 어떤 타입으로 다루냐에 따라 계산 결과가 달라지는 현상이었습니다. 예를 들어 2000001은 사람이 화면으로 보기에는 그냥 숫자에 불과합니다.

String

그러나 이것을 문자열 타입으로 저장하면 메모리에 다음과 같은 값이 저장됩니다. 파이썬으로 해시 값을 계산하면 아래와 같습니다.

import hashlib

# make a input (string)
input = "2000001".encode('utf-8')

# compute
sha256 = hashlib.sha256()
sha256.update(input)
output = sha256.hexdigest()

# print
print(f"output : {output}")

# output : 637598187c9b9704788ccd43811de300633c9e7e66e7ac155468b3c4721b5ff6

Int64

반대로 이것을 Int64 타입으로 저장하면 메모리(Little Endian 컴퓨터)에 다음과 같은 값이 저장됩니다. 파이썬으로 해시 값을 계산하면 아래와 같습니다.

import hashlib
import struct

# make a input (@ = machine's byte order, q = 64 bits integer) 
input = struct.pack("@q", 2000001)

# compute
sha256 = hashlib.sha256()
sha256.update(input)
output = sha256.hexdigest()

# print 
print(f"output : {output}")

# output : 0de460651e65263439fb031f1bb75dea5356e17747b73a77233af8dd84b70e07

마치며

결과적으로 위 문제는 고객이 항상 문자열 타입으로 변환하여 해시 계산을 하는 도구를 사용하여 Int64 타입 데이터 해시 값을 계산하였기 때문이었습니다. OpenSSL 쉘을 사용하면 값에 쌍따옴표를 붙이든 때든 항상 문자열로 해시값이 계산되는 것을 확인할 수 있습니다.

$ echo -n 2000001 | openssl dgst -sha256
SHA2-256(stdin)= 637598187c9b9704788ccd43811de300633c9e7e66e7ac155468b3c4721b5ff6
$ echo -n "2000001" | openssl dgst -sha256
SHA2-256(stdin)= 637598187c9b9704788ccd43811de300633c9e7e66e7ac155468b3c4721b5ff6
profile
소프트웨어 엔지니어, 일상

0개의 댓글