해시 라이브러리를 활용한 사용자 인증 시스템 구현

문제: 해독이 불가능한 경우에도 원본 비밀번호를 알 수 있을까?

사용자 등록


import hashlib
# 1. 사용자 등록
사용자이름 = input("사용자 이름을 입력하세요: ").strip()
비밀번호 = input("비밀번호를 입력하세요: ").strip()

# 2. 암호화
암호화객체 = hashlib.md5('보안키값'.encode('utf-8'))
암호화객체.update(비밀번호.encode('utf-8'))
암호화된비밀번호 = 암호화객체.hexdigest()

# 3. 파일에 저장
with open('사용자정보', mode='a', encoding='utf-8') as 파일:
    파일.write(f"{사용자이름},{암호화된비밀번호}")

사용자 로그인 - 함수 버전

  • 권장 구조
  • 전역 변수는 반드시 대문자, 지역 변수는 소문자로 사용
  • not, 부정 연산자 사용

import hashlib

보안키 = '보안키값'


def 사용자입력():
    사용자이름 = input("사용자 이름을 입력하세요: ").strip()
    비밀번호 = input("비밀번호를 입력하세요: ").strip()
    return 사용자이름, 비밀번호


def md5(문자열):
    암호화객체 = hashlib.md5(보안키.encode('utf-8'))
    암호화객체.update(문자열.encode('utf-8'))
    return 암호화객체.hexdigest()


def 로그인확인(사용자이름, 암호화된비밀번호):
    로그인성공 = False
    with open('사용자정보', mode='r', encoding='utf-8') as 파일:
        for 라인 in 파일:
            라인 = 라인.strip()
            
            # 빈 라인이면 건너뛰기
            if not 라인:  
                continue
            저장된사용자, 저장된비밀번호 = 라인.split(",")
            if 저장된사용자 == 사용자이름 and 저장된비밀번호 == 암호화된비밀번호:
                로그인성공 = True
                break
    return 로그인성공


def 사용자정보가져오기():
    사용자사전 = {}
    with open('사용자정보', mode='r', encoding='utf-8') as 파일:
        for 라인 in 파일:
            라인 = 라인.strip()
            
            # 빈 라인이면 건너뛰기
            if not 라인:  
                continue
            저장된사용자, 저장된비밀번호 = 라인.split(",")
            사용자사전[저장된사용자] = 저장된비밀번호
    return 사용자사전


def 실행():
    # 1. 사용자 등록
    # 사용자이름, 비밀번호 = 사용자입력()

    # 2. 비밀번호 암호화
    # 암호화된비밀번호 = md5(비밀번호)

    # 3. 파일에 저장
    # with open('사용자정보', mode='a', encoding='utf-8') as 파일:
    #     파일.write(f"{사용자이름},{암호화된비밀번호}")

    # 1. 사용자 로그인

    사용자이름, 비밀번호 = 사용자입력()
    # 2. 비밀번호 암호화
    암호화된비밀번호 = md5(비밀번호)

    # 3. 파일 읽기 + 암호화된 비밀번호 비교(간단) 로그인 시, 비교 방법 1
    로그인성공 = 로그인확인(사용자이름, 암호화된비밀번호)
    if 로그인성공:
        print('로그인 성공')
    else:
        print('로그인 실패')

    # 비교 방법 2:
    사용자사전 = 사용자정보가져오기()
    db비밀번호 = 사용자사전.get(사용자이름)
    if db비밀번호 == 암호화된비밀번호:
        print('로그인 성공')
    else:
        print('로그인 실패')


if __name__ == '__main__':
    실행()

태그: hashlib MD5 비밀번호암호화 사용자인증 파이썬보안

6월 1일 03:32에 게시됨