비밀번호 해싱은 왜 하는가?
사용자의 패스워드를 데이터베이스에 그대로 저장하게 되면
데이터베이스에 접근할 수 있는 모든 사람에게 패스워드를 그대로 노출하게 된다.
그래서 패스워드를 암호화하기 위한 방법 중 하나로 hash를 사용하는 것이다.
hash의 특징?
- hash 함수는 동일한 입력값에 대한 동일한 출력값을 가짐
- 입력값이 아주 조금만 변경되어도 출력값은 크게 바뀜
- 해쉬 함수는 항상 같은 방향(일방향)으로만 작동함
위와 같은 특징을 가지고 있다
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
그 중 가장 많이 쓰이는 것 같은 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()는 해싱한 바이트를 문자열로 반환해준다.
'[내일배움캠프]스파르타코딩클럽 AI 웹개발 > Today I Learned' 카테고리의 다른 글
[내일배움캠프 08일차 TIL] ASCII(아스키코드) with python (0) | 2024.07.03 |
---|---|
[내일배움캠프 07일차 TIL]무한루프 반복문 (1) | 2024.07.02 |
[내일배움캠프 05일차] 패킹과 언패킹 (0) | 2024.06.28 |
[내일배움캠프 04일차 TIL] requests & beautifulsoup (0) | 2024.06.27 |
[내일배움캠프 03일차 TIL] 오류에 대처하기 (0) | 2024.06.26 |