회원가입 views.py 작성 - 비밀번호 암호화

이유진·2021년 11월 27일
0

Westagram

목록 보기
3/3
post-thumbnail

이전에 회원가입 views.py를 작성할 때,
입력받은 비밀번호를 DB에 저장할때, 가공하지 않고(암호화 하지 않고)
그대로 DB에 입력하는 방식으로 코드를 작성했었다.

이번에는,
1)비밀번호를 가공하여(암호화 하여) DB에 저장하는 방법과
2)개념을 정리하기 위해
따로 벨로그를 작성하게 되었다.

1. encode 와 decode 개념

1) 표 정리


encode('utf-8')decode('utf-8')
typebytes => b'( )string
바이트 형태문자열 형태
용도해시된 패스워드를 만들때DB에 저장할때
전환string -> bytesbytes -> string


2) *python shell에 입력(encode와 decode type) 👇


위의 사진(👆)에서 입력한 코드들이 어떤것들을 의미하는 건지,
하나하나 다시 작성하면서 자세히 작성해보겠다.

import bcrypt                           #--> bcrypt 라이브러리를 import 하여 이용하여 작성

password = '1234'                       #--> 입력받은 비밀번호(1234)라고 생각하고, 변수인 password에 담아보았다.

type(password)                          #--> <class 'str'> : 문자열(string) 확인

hashed_password = bcrypt.hashpw(password.encode('utf-8'),      bcrypt.gensalt()) 
#--> 변수명       = bcrypt.hashpw(입력받은 패스워드.encode('utf-8'), bcrypt.gensalt())

type(hashed_password).                  #--> <class 'bytes'> : 바이트(bytes) 확인

hashed_password => b'$2b$12$DwYpFdfu4QFSDwNuhLJEaOdc66mBrTQrlY8FznEpY0wOC/vdzASVS'
#--> bcrypt 라이브러리를 통해, 암호화된 비밀번호 1234의 모습
#    DB에 저장하기 위해, 다시 string 으로 변환해줘야 함
     
hashed_password.decode('utf-8')         #--> $2b$12$DwYpFdfu4QFSDwNuhLJEaOdc66mBrTQrlY8FznEpY0wOC/vdzASVS
type(hashed_password.decode('utf-8'))   #--> <class 'str'> : 문자열(string) 확인                                         #    DB에 저장하기 위해, decode화 해줘야 함




2. Vscode 입력

1) 이전에 회원가입 코드에, 비밀번호 암호화 코드 추가한 기록👇

2) 추가된 비밀번호 암호화 코드👇

import bcrypt

hashed_password = bcrypt.hashpw(password.endcode('utf-8'), bcrypt.gensalt()).decode('utf-8')
  • 변수명1 = bcrypt.hashpw(입력받은 password.encode('utf-8'), bcrypt.gensalt())
    /#--> 입력받은 패스워드를 byte type로 변환

  • 변수명2 = 변수명1.decode('utf-8')
    /#--> 입력받은 패스워드를 byte type 변환 후, DB에 저장하기 위해 string type로 변환

    => 위에 작성한 코드는 '변수명1' 부분과 '변수명2'를 한줄의 코드로 합친 모습




3. +)추가

DB에 'bytes' type도 저장은 가능하다.

그러나!!

나중에, bytes type로 DB에 저장된 패스워드와
로그인할때 DB에 저장되어 있던 패스워드와 동일한 패스워드를 비교할때,
서로 다른 패스워드로 인식하게 된다.

그 이유에 대해서, 눈으로 직접 확인해보도록 하겠다.

내 연습용 DB(👆)에 저장되어 있는 이용자 4명중
ID = 1과 ID =2 인 이용자(user)는 password가 암호화가 되지 않은 상태로 저장되어 있고,
ID = 5와 ID =6 인 이용자(user)는 password가 암호화가 된 상태로 저장되어 있다.

근데, ID = 5와 ID = 6의 password의 형태(모양)가 다름을 알수 있다.
views.py에 입력한 코드가 서로 다르기때문에,

ID = 5는 `bytes` 타입의 형태로 ,
ID = 6은 `string` 타입의 형태로 

저장된 것을 확인 할 수 있다.

1) ID = 5 유저를 회원가입한 코드

python shell에서 DB에 저장된 ID = 5 유저의 패스워드 type

  • DB에 저장할 때,
    decode(string type 변환)를 하지 않은 상태로 bytes 타입으로 저장 할 경우,
    b' '까지 패스워드로 인식하여, b' '까지 포함한 패스워드를 string 타입으로 DB에 저장된다.

2) ID = 6 유저를 회원가입한 코드

python shell에서 DB에 저장된 ID = 6 유저의 패스워드 type

profile
차근차근 배워나가는 주니어 개발자

0개의 댓글