반응형
PASSWORD 암호화 설정 방법
TIP
원래 문장을 암호화하는걸 암호화라고하고
암호화된 문장을 원래문장으로 만드는걸 복구화라고한다
암호화된 문장은 복구화되면 안된다.
따라서 암호화된 문장을 복구할 수 없게 만드는password를 hash password라고 한다.
hash는 random과 같다.
예를들어 1234를 암호화 할 경우 패턴이 발생되는데
그냥 발생되는 패턴은 해킹에 취약하기 때문에
salt 혹은 seed를 만들어서
원래 비밀번호 문장에다가 누구나 알수 없는 문자열을 붙이고
원문비밀번호를 암호화해서 DB에 저장한다.
Library
# 비밀번호 암호화하는 라이브러리 설치
# pip install psycopg2-binary
# pip install passlib
먼저 utils.py 파일을 추가 후 코드를 작성해 준다.
from passlib.hash import pbkdf2_sha256
# 원문 비밀번호를 암호화 하는 함수
def hash_password(original_password) :
salt = 'yh*hello12'
password = original_password + salt
password = pbkdf2_sha256.hash(password)
return password
# 비밀번호가 맞는지 확인하는 함수, True /False를 리턴한다.
def check_password(original_password, hash_password) :
salt = 'yh*hello12'
check = pbkdf2_sha256.verify(original_password+salt, hash_password)
return check
회원가입 API에 비밀번호 암호화를 해준다.
from http import HTTPStatus
from flask import request
from flask_jwt_extended import create_access_token
from flask_restful import Resource
from mysql.connector.errors import Error
from mysql_connection import get_connection
import mysql.connector
from email_validator import validate_email, EmailNotValidError
from utils import check_password, hash_password
# 회원가입은 Method = POST, '/users/register', data = username, email, password
class UserRegisterResource(Resource) :
def post(self) :
# {
# "username": "홍길동",
# "email": "abc@gmail.com",
# "password": "1234"
# }
# 1. 클라이언트가 body에 보내준 json을 받아온다.
data = request.get_json()
# 2. 이메일 주소형식이 제대로 된 주소형식인지 확인하는 코드작성.
try:
validate_email(data['email'])
except EmailNotValidError as e:
# email is not valid, exception message is human-readable
print(str(e))
return {"error" : str(e)}, 400
# 3. 비밀번호의 길이가 유효한지 체크한다.
# 비밀번호 길이는 4자리 이상, 12자리 이하로 한다. (예외처리)
if len(data['password']) < 4 or len(data['password']) > 12 :
return {"error" : '비밀번호의 길이를 확인하세요'}, 400
# 4. 비밀번호를 암호화 한다.
# data['password']
hashed_password = hash_password(data['password'])
print(hashed_password)
# 5. DB에 회원정보를 저장한다.
# 받아온 데이터를 DB에 저장하면 된다.
try :
# 데이터 insert
# 5-1. DB에 연결
connection = get_connection()
# 5-2. 쿼리문 만들기
query = '''insert into user
(username, email, password)
values
( %s , %s , %s );'''
record = (data['username'], data['email'], hashed_password )
# 5-3. 커서를 가져온다.
cursor = connection.cursor()
# 5-4. 쿼리문을 커서를 이용해서 실행한다.
cursor.execute(query, record)
# 5-5. 커넥션을 커밋해줘야 한다 => 디비에 영구적으로 반영하라는 뜻
connection.commit()
# 5-5-1 DB에 저장된 아이디값 가져오기
user_id = cursor.lastrowid
# 5-6. 자원 해제
cursor.close()
connection.close()
except mysql.connector.Error as e :
print(e)
cursor.close()
connection.close()
return {"error" : str(e)}, 503
# user_id를 바로 보내면 안되고
# JWT로 암호화 해서 보내준다.
access_token = create_access_token(user_id)
# 토큰 유효기간 만료 시키는 방법
# access_token = create_access_token(user_id, expires_delta=datetime.timedelta(minutes = 1))
return {"result" : "success", 'access_token' : access_token}, 200
POSTMAN으로 데이터를 추가해서 확인한다.

DB에서 확인해본다.

정상적으로 암호화되어 회원가입된걸 확인 할 수 있다.
반응형
'BackEnd' 카테고리의 다른 글
| API - JWT를 이용해 LOGOUT 기능 만들기 (0) | 2022.06.21 |
|---|---|
| API - email 주소형식이 제대로 된 주소형식인지 확인하는 코드 (0) | 2022.06.20 |
| API - JWT 유효기간 만료시키는 방법 (0) | 2022.06.20 |
| API - 로그인한 유저만 처리할 수 있는 API에 JWT 토큰 적용하는 방법 (0) | 2022.06.20 |
| API - 회원가입 / 로그인 API에서, 토큰 생성해서 처리하는 방법 (0) | 2022.06.20 |