아이디와 비밀번호를 확인하는 절차
생성(Sign Up)
하는 기능,확인(Sign In)
하는 기능이 우선적으로 필요회원가입과 로그인으로 인증을 구현
access token
을 전송request에 access token을 첨부하여 서버에 전송해 매번 로그인하지 않도록함
암호화
되어서 DB에 저장되어야함고정된 길이의 데이터(Byte열)
로 반환시키는 함수'암호화'
는 가능하지만, 암호문을 평문으로 바꾸는 '복호화'
는 불가능한 암호화단방향 해시 함수(one-way hash function)
이라고 함Rainbow table
이라고 함1) Salting
2) Key Stretching
$ pip install bcrypt
import bcrypt
# 평문
password = '12345678'
# 암호화하여 저장
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
# 일치 여부 확인
bcrypt.checkpw('12345678'.encode('utf-8'), hashed_password.encode('utf-8'))
gensalt()
: 해시 함수에서 암호화된 비밀번호를 생성할 때 추가 문자열hashpw(password, bcrypt.gensalt())
: 암호화된 비밀번호 생성checkpw(password, hasedpassword)
: boolean 타입으로 입력된 값과 암호화된 비밀번호를 비교. 일치할 경우 Ture, 불일치할 경우 False 반환>>> import bcrypt
### password 입력
>>> password = '1234123'
### bcrypt를 이용하여 암호화 (bcrypt.gensalt()는 salt 값을 지정하는 함수)
>>> hased_password = bcrpyt.hashpw(password, bcrypt.gensalt())
:::: 📌 위처럼 평문으로 password값을 지정하면 에러가 뜸
>>> TypeError: Unicode-objects must be encoded berfore hasing
위 에러는 unicode 객체는 반드시 해슁 전에 인코딩하여 넣어야한다는 것을 알려준다.
더 자세히말하면, 현재 password의 타입은 str,
bcrypt를 하기 위해서는 byte 타입으로 만들어(인코딩)줘야함
>> hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
>>> hashed_password
b'$2b$12$XXdgXRMbmhCcXOwfZsc3XuAEGb6OC2ZrmanIrLWf9on6Z1iGHpWAm'
# 암호화 된 password를 DB에 저장하기 좋은 형태로 string으로 다시 decode
>>> hashed_password = hashed_password.decode('utf-8')
>>> hashed_password
'$2b$12$XXdgXRMbmhCcXOwfZsc3XuAEGb6OC2ZrmanIrLWf9on6Z1iGHpWAm'
입력받은 값과 DB에 암호화되어 저장되어 있는 비밀번호가 일치하는지 확인하는 과정
>>> bcrypt.checkpw('1234123'.encode('utf-8'), hashed_password.encode('utf-8'))
True
# 일치하면 Ture, 불일치하면 False 반환
# DB에 저장된 암호화된 비밀번호는 byte 타입이 아니므로, checkpw 함수 또한 encode해줘야함
# 참고로, hased_password에는 이미 Salt 값이 저장되어 있으므로, salt값을 가져오는 과정은 필요 없다.
.encode('utf-8')
.decode('utf-8')