본문 바로가기
API/API 관련 설정 및 라이브러리

회원가입,로그인시 필요한 라이브러리 패스워드 해싱, 이메일형식 유효검사

by 하니__ 2024. 5. 21.

 
 
 

데이터베이스 상호작용과 비밀번호 해싱
pip install psycopg2-binary

pip install passlib

 
 
 

 
PostgreSQL 데이터베이스와 상호 작용하기 위한 psycopg2-binary 패키지
비밀번호 해싱을 위한 passlib 패키지
 

psycopg2-binary 사용법
import psycopg2

# 데이터베이스에 연결
connect = psycopg2.connect(
    dbname="your_db",
    user="your_user",
    password="your_password",
    host="your_host",
    port="your_port"
)

# 커서를 생성
cursor = connect.cursor()

 
이후 커서로서 역할 수행
 
 

passlib 사용법
from passlib.hash import pbkdf2_sha256

# 비밀번호 해싱
hashed_password = pbkdf2_sha256.hash("your_password")


# 비밀번호 검증
is_correct = pbkdf2_sha256.verify("your_password", hashed_password)

 

해싱과 암호화는 비슷하지만
약간의 차이가 있다

해싱(Hashing)

  • 단방향성: 해싱 함수는 입력 값을 고정된 길이의 문자열(해시)로 변환합니다. 이 과정은 단방향으로, 해시된 값을 원래의 값으로 되돌릴 수 없습니다.
  • 고정된 길이: 해싱 함수의 출력은 항상 고정된 길이입니다. 예를 들어, 입력 값이 아무리 길어도 SHA-256 해싱 함수는 256비트의 해시 값을 생성합니다.
  • 주로 비밀번호 저장에 사용: 해싱은 비밀번호를 저장할 때 사용됩니다. 데이터베이스에 해시된 비밀번호를 저장하면, 원본 비밀번호는 저장되지 않으므로 해킹 당하더라도 원본 비밀번호를 알 수 없습니다.

암호화(Encryption)

  • 양방향성: 암호화는 데이터를 읽을 수 없는 형식으로 변환하지만, 올바른 키를 사용하면 원래 데이터를 복원할 수 있습니다.
  • 가변 길이: 암호화된 출력의 길이는 원본 데이터와 암호화 알고리즘에 따라 달라질 수 있습니다.
  • 주로 데이터 전송에 사용: 암호화는 데이터를 안전하게 전송하거나 저장할 때 사용됩니다. 데이터를 복원하려면 암호화에 사용된 키가 필요합니다.

즉, 비밀번호를 지키는데에는
암호화보다는 해싱이 더 이롭다
 
 
물론 비밀번호를 잊어버렸을 시에는
되찾을 수 없으니
 
재설정 코드가 필요하다

함수 사용시
def hash_password(original_password) :
    password = pbkdf2_sha256.hash(original_password)
    return password

라고 사용 할 수 있지만

 

random seed를 찾기가 가능해져

아래와 같이 추가 문구를 넣어 좀 더 복잡하게 한다

def hash_password(original_password) :
    original_password + 'atauoi31nto$#^*@as1325267SFA'
    password = pbkdf2_sha256.hash(original_password)
    return password

 

이는 또 다른 유출을 막기위해 지난번과 같이 config.py에 따로 작성하여

SALT 라고 변수처리 하자

 

 

 

비밀번호 체크하는 함수 또한 아래와 같다

 

비밀번호 체크 함수
def check_password(original_password, hashed_password) :
    original_password + Config.SALT
    pbkdf2_sha256.verify(orginal_password, hashed_password)

 

로그인을 할때의

유저는 해싱되기전의 비밀번호를 입력할 것이고

DB에서는 해싱후의 비밀번호만을 알고 있으니

 

이게 서로 맞는지 체크과정이 필요하다
 
 

이메일 형식이 맞는지 확인
pip install email-validator

 
 

from email_validator import validate_email, EmailNotValidError

email = "test@example.com"

try:
    v = validate_email(email)
except EmailNotValidError as e:
    print(str(e)) # 틀렸을경우 어떻게 틀렸는지 출력

라고 입력하여
 
이메일 형식이 알맞은지 검사하고
유효하지 않은 경우 예외를 발생시킨다
 
이메일 형식이 알맞다면 통과시키는 라이브러리이다