SHA를 알아보고 사용해봅시다.

Hash function

  • 우선 HASH라는 것은 “어떤 특정한 input에 대해서 어떤 output을 만들어내는 함수”를 말합니다. 여기서 중요한 것은 가급적 input에 따라서 output이 달라지게 표현될 수록(서로 다른 input에 대해서 서로 다른 output이 나올 때) 좋은 HASH라고 말할 수 있습니다.
    • 예를 들어, lambda x: s%999999999999999999같은 Hash function은 아마도 썩 괜찮은 function이라고 할 수 있을 것 같습니다(물론 계산 시간을 무시했을때)
  • 보안에서 이 부분이 중요한 이유는, hash는 단방향 함수이고, 비밀번호 자체는 몰라도 비밀번호를 hash function에 넣었을 때 나오는 결과 값만으로 옳은 비밀번호를 입력했는지 입력하지 않았는지를 정확하게 알 수 있기 때문입니다.
    • 해당 hash function의 collision rate(서로 다른 input에 대해서 같은 output이 나올 가능성)이 적을수록 더 보안 측면에서 안정한 hash function이라고 할 수 있겠네요.

Secure Hashing Algorithm

  • SHA는 “안전한 해쉬알고리즘”이라고 말할 수 있습니다(블록체인에서 SHA를 많이 쓴다고들 하던데). 사실 만들 수 있는 hash function은 아주 많은데, 그중에서 매우 안전한 hash function들에 SHA를 붙여서 함수군으로 지정합니다.
  • SHA0, SHA1 등 종료는 매우 다양한데, 보통 요즘에는 SHA256을 많이 쓴다고들 합니다.

hashlib

  • 간단하게 hashlib이라는 라이브러리를 이용해서 SHA256을 사용해볼 수 있습니다.
  • 특히, 공백 하나만 추가되어도 hash 결과가 아주 크게 달라지는 것이 인상깊네요.
import hashlib

msg = "I am a boy"
bin_msg = msg.encode()

print(hashlib.sha256(bin_msg).digest())
print("="*20)

print(hashlib.sha256(bin_msg).hexdigest())
print("="*20)
##########################
print()
msg = "I am a boy "
bin_msg = msg.encode()

print(hashlib.sha256(bin_msg).digest())
print("="*20)

print(hashlib.sha256(bin_msg).hexdigest())
print("="*20)
b'\x07&\xf9\xf8\x8b\xc3\xdc\x7f\xcb\xd9N\xaeMa\x94\x16\xa1\x10\xc2\x98\xb3U\xb9\xcc\xaa\xbc\xb4\x98Q\x99W\x99'
====================
0726f9f88bc3dc7fcbd94eae4d619416a110c298b355b9ccaabcb49851995799
====================

b'\'"1\x1b\t\xff[.\xe6H\xe8\xb5~3wQ\x8cd/\x88\x91\x94"06=\xa9\xaa\xdd:\xec\xcd'
====================
2722311b09ff5b2ee648e8b57e3377518c642f8891942230363da9aadd3aeccd
====================

wrap-up

  • 이제 다음에 SHA256을 가지고 블록체인을 좀 파보면 좋겠다, 라는 생각을 하게 됩니다.

reference

댓글남기기