>

TIL

2주차 Day 3. 해싱

ekdud 2024. 7. 3. 21:05

비밀번호 해싱

*해싱(hashing) : 원본 문자열을 알아볼 수 없는 난해한 문자열로 정의하는 것. 해시값을 조사하여 데이터 변조 여부를 확인하는 것이 주된 목적이다. 단방향 암호화 알고리즘이므로 원래의 문자열로 복수할 수 없다.

 

- hashlib : 문자열을 해싱할 때 사용하는 모듈. (MD5, SHA256, SHA512 등의 해시함수 제공)

고정된 길이의 바이트 시퀀스로 해시 값을 제공. 동일한 입력 데이터에 대해서는 항상 동일한 해시 값을 반환.

 

import hashlib

# 문자열 "password is abcd"를 해싱
string = "password is abcd"
hash_object = hashlib.sha256(string.encode())
hex_dig = hash_object.hexdigest()

print(hex_dig)

 

digest() : 해싱한 바이트 문자열을 반환.

hexdigest() : 바이트 문자열을 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')) #바이트 문자열을 전달받도록 .encode('utf-8') 이용.
        with open('passwd.txt', 'r') as f:
            return m.hexdigest() == f.read()
    else:
        return True


if check_passwd():
    passwd = input('새로운 비밀번호를 입력하세요:') #작성한 비밀번호 파일이 없거나 기존 비밀번호와 일치할 때 True.
    with open('passwd.txt', 'w') as f:
        m = hashlib.sha256()
        m.update(passwd.encode('utf-8'))
        f.write(m.hexdigest())
else:
    print("비밀번호가 일치하지 않습니다.")

 

 

 

비밀번호를 암호화하는 것은 알겠는데 그럼 비밀번호 입력 시 어떻게 입력 내용을 화면에 보이지 않도록 할 수 있을까?

: getpass모듈을 사용해보자.

 
    import hashlib
    import getpass
 
    password = getpass.getpass("회원 비밀번호: ")               
    password_hash = []
    password_hash.append(hashlib.sha256(password.encode()).hexdigest())
 

 

요구사항에 따라 적절한 해시 함수를 선택하여 사용. 일반적으로 SHA-256 또는 SHA-512와 같은 안전한 해시 함수를 사용하는 것이 좋다.

 


 

ALGORITHM CODE KATA

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. (school.programmers.co.kr)

def solution(n):
    num = [i for i in str(n)]
    reverse_n = [int(i) for i in num[::-1] ]
    
    return reverse_n

 

입력받은 n을 문자열로 변환하여 각각의 문자를 리스트에 담고, 역순으로 리스트에 다시 담는 방식으로 풀었다.