본문 바로가기

[내일배움캠프]스파르타코딩클럽 AI 웹개발/Today I Learned

[내일배움캠프 06일차 TIL] 비밀번호 해싱 with hashlib in python

 

 

비밀번호 해싱은 왜 하는가?

사용자의 패스워드를 데이터베이스에 그대로 저장하게 되면 

데이터베이스에 접근할 수 있는 모든 사람에게 패스워드를 그대로 노출하게 된다.

그래서 패스워드를 암호화하기 위한 방법 중 하나로 hash를 사용하는 것이다.

 

hash의 특징?

  1. hash 함수는 동일한 입력값에 대한 동일한 출력값을 가짐
  2. 입력값이 아주 조금만 변경되어도 출력값은 크게 바뀜
  3. 해쉬 함수는 항상 같은 방향(일방향)으로만 작동함

위와 같은 특징을 가지고 있다

 

hash의 문제?

해쉬 함수는 레인보우 테이블을 기반으로 암호화가 진행된다

그래서 레인보우테이블을 알면 비밀번호 해킹이 가능한 것!

이 문제때문에 생겨난 것이 "salt"

 

 

그럼 "salt"는 무엇인가?

salt는 짧은 랜덤 텍스트로 패스워드를 데이터베이스에 저장할 때

사용자가 입력한 패스워드와 salt를 함께 hash를 사용해 암호화하고 데이터베이스에 저장하는 것

 


파이썬에서는 hashlib이라는 라이브러리를 통해 해싱을 할 수 있다.

hashlib에는 

  • MD5
  • SHA-2 (SHA-224 , SHA-256 , SHA-384, SHA-512)
  • SHA-3 (SHA-3-256, SHA-3-512)
  • BLAKE2

등을 제공한다

 

MD5는 오래 되어 충돌방지가 되어있지 않아 사용을 권장하지 않는다고 하고,

그 중 SHA-2를 가장 일반적으로 사용하는 것 같다

SHA-3는 SHA-2보다 안전하지만 느리다. SHA-2도 충분히 안전하기 때문에 굳이 SHA-3를 사용할 이유는 없다고 한다

BLAKE2 해시는 SHA-1 , SHA-2 , SHA-3, MD5 보다  빠르고 SHA-2 보다 훨씬 더 안전하다. 멀티코어 시스템에서 병렬 컴퓨팅을 지원하는 최신 CPU에 사용하기에 적합하다고 한다.

 

https://thepythoncode.com/article/hashing-functions-in-python-using-hashlib

 

How to Use Hashing Algorithms in Python using hashlib - The Python Code

Using different hashing algorithms such as SHA-2, SHA-3 and BLAKE2 in Python using hashlib built-in module for data integrity.

thepythoncode.com

 

 

 


그 중 가장 많이 쓰이는 것 같은 SHA-256을 사용해 해싱을 해 보았다.

import hashlib

pw = "asdf"
pw_hash = hashlib.sha256(pw)

print(pw)

 

처음엔 냅다 해싱을 했는데

바로 오류가 났다.

TypeError: Unicode-objects must be encoded before hashing

 

해싱을 하기 전에 인코딩을 하라는 오류를 발견해서

인코딩 하는 방법에 대해 찾아보고 다시 시도해 보았다

 

pw = '123d'
hash_object = hashlib.sha256() 
hash_object.update(pw.encode()) 
pw_hash = hash_object.hexdigest() 
# pw_hash_digest = hash_object.digest()
print(pw_hash)

 

먼저 해싱을 할 객체를 생성하고

문자열을 바이트로 변환해서 update에 전달한다

만약 update에 전달할 데이터가 문자열이면 encode() 메소드를 사용해서 바이트로 변환해주어야 한다

그리고 해싱한 바이트를 다시 문자열로 반환하여 출력하였다

 

그렇게 하고 나사

1c8f50a9fc13e2a890bac09ef7e71e1633f5dbb1f72e57125db16e4c3587e2fc

와 같은 결과를 얻었다.

 

해싱한 바이트를 다시 문자열로 반환하는 방법도 2가지가 있었다.

pw_hash = hash_object.hexdigest()
pw_hash_digest = hash_object.digest()

먼저 위에서 사용한 hedxgigest()는 해싱한 바이트 문자열을 16진수로 반환해주고

digest()는 해싱한 바이트를 문자열로 반환해준다.

 

 

https://wikidocs.net/122201

 

056 비밀번호를 암호화하여 저장하려면? ― hashlib

hashlib은 MD5, SHA256 등의 알고리즘으로 문자열을 해싱(hashing)할 때 사용하는 모듈이다. > 해싱(hashing)이란 원본 문자열을 알아볼 수 없는 난해한…

wikidocs.net