hashlib은 MD5, SHA256 등의 알고리즘으로 문자열을 해싱(hashing)할 때 사용하는 모듈이다
*해싱(hashing): 원본 문자열을 알아볼 수 없는 난해한 문자열로 정의하는 방법으로, 해시값을 조사하여 데이터 변조 여부를 확인하는 것이 주된 목적
사용자가 입력한 비밀번호를 passwd.txt 파일에 저장하는 프로그램을 만들어야 한다. 이때 비밀번호는 유추나 복호화가 불가능한 SHA256 방식으로 해싱해야 하며 이미 저장한 비밀번호가 있을 때는 입력한 비밀번호와 일치할 때만 새로운 비밀번호로 저장해야 한다. 이런 프로그램은 어떻게 만들어야 할까?
문자열을 해싱하기 위해 hashlib 모듈을 사용한다
import hashlib
m = hashlib.sha256() #SHA256 방식으로 해싱
m.update('Life is too short'.encode('utf-8'))
m.update(', you need python.'.encode('utf-8'))
m.digest()
print(m.digest())
print(m.hexdigest())
👉 hashlib.sha256()로 생성한 객체 m에 해싱할 문자열을 인수로 update() 함수를 호출하면 문자열이 해싱된다. 이 함수에 전달하는 문자열은 바이트 문자열이어야 하므로 .encode('utf-8')을 이용하여 유니코드 문자열을 UTF-8 형식의 바이트 문자열로 변환한다. 해싱할 문자열을 추가하고 싶으면 추가할 문자열과 함께 update() 함수를 추가로 호출한다
문자열을 해싱한 다음에는 digest() 또는 hexdigest() 함수를 사용하여 해싱한 문자열을 얻을 수 있다. digest()는 해싱한 바이트 문자열을 반환하고 hexgigest()는 바이트 문자열을 16진수로 변환한 문자열을 반환한다
import hashlib
import os
def check_passwd():
if os.path.exists('passwd.txt'):
before_passwd = input('기존 비밀번호를 입력하세요:')
m = hashlib.sha256()
m.update(before_passwd.encode('utf-8'))
with open('passwd.txt', 'r') as f:
return m.hexdigest() == f.read()
else:
return True
if check_passwd():
passwd = input('새로운 비밀번호를 입력하세요:')
with open('passwd.txt', 'w') as f:
m = hashlib.sha256()
m.update(passwd.encode('utf-8'))
f.write(m.hexdigest())
else:
print("비밀번호가 일치하지 않습니다.")
🗒 check_passwd() 함수는 작성한 비밀번호 파일이 없거나 기존 비밀번호와 일치할 때 True를 반환한다. 이 함수가 True를 반환할 때만 새로운 비밀번호를 생성하여 파일로 저장한다. 이미 저장한 비밀번호 파일이 있을 때는 사용자가 입력한 비밀번호와 기존 비밀번호가 일치하는지 비교하고자 사용자가 입력한 값을 해싱하여 저장한 해시값과 비교한다
검증 방식
비밀번호 일치 여부를 검증하고자 사용자로부터 입력받은 이전 비밀번호를 해싱하고 나서 파일에 저장한 값과 비교한다. 해싱한 문자열은 복구할 수 없으므로
항상 이러한 방식으로 검증해야 한다