Django

Why convert saveDB byte → String

traveler_JH 2022. 7. 6. 22:29

유저의 비밀번호를 데이터 베이스에 저장을 하면서 bcrypt를 사용하여 진행을 했는데 왜 데이터베이스에 디코딩을 해서 집어넣어야하는지 알게되어 적어본다.

유저의 비밀번호 저장 방법

  1. 유저 아이디와 비밀번호 생성 비밀번호 인코딩
  2. 유저 비밀번호 암호화 해서 디코딩 후 DB에 저장(인코딩 상태로 저장하게되면 byte 상태를 나타내는 해쉬문자열 앞 b까지 문자열로 DB에저장됨 꺼내어 사용시 기존 입력했던 암호와 다른 암호가 되니 주의!)
  3. 유저 로그인 -> 아이디와 비밀번호 입력
  4. 유저가 생성한 비밀번호 인코딩 한후 암호화되서 DB에 저장된 유저 비밀번호와 비교.
  5. 해시할 문자열 인코딩
In [12]: a.encode('utf-8')
Out[12]: b'1234'

5.password 해시

In [15]: hashed_pw = bcrypt.hashpw(a.encode('utf-8'), bcrypt.gensalt())

해시할 변수를 선언하고 그안에 bcrypt.hashpw 해시를 생성하는 함수에 인코딩된 인자 a 와 salt값을 추가 할 bcrypt.gensalt() 를 넣으면 Salt값이 추가된 해시된 비밀번호가 생성된다.

In [18]: a
Out[18]: '1234'

In [19]: hashed_pw_none = bcrypt.hashpw(a.encode('utf-8'), bcrypt.gensalt())

In [20]: hashed_pw_none
Out[20]: b'$2b$12$bQUi1ZmiOPEBUyjifhCHnOEBsUSx4P7U3iVMqmlS6u4I.z4gnJ93C'

DB에 저장시 디코딩 해서 저장해야함!

이유 db에 저장될때 따옴표로 쌓여있는 부분 뿐만이 아니라 byte 타입을 나타내는 b 부터 전체가 DB에 저장되기때문에 아래 코드처럼 decode를 처리해서 DB에 저장되야한다.

(추후에 비교할때 b’ ←이부분 부터 체크되기 때문에 기존의 암호화 다른 암호가 된다.)

In [21]: hashed_pw_decode = bcrypt.hashpw(a.encode('utf-8'), bcrypt.gensalt()).decode()

In [22]: hashed_pw_decode
Out[22]: '$2b$12$kx0wrOz8d7OfGb1CAKe68.39XNunL/NPYqJAkhtyzoQDVj8imRyQK'

해시된암호 비교방법

	a='1234'		#사용자가 입력한 패드워드
   #hased_pw는 DB에 저장된 암호화된 패스워드
해쉬된 비밀번호가 일치하면 True 일치하지 않다면 False가 출력된다 

# 3번예제 ) decode해서 저장한경우
In [24]: bcrypt.checkpw(a.encode('utf-8'), hashed_pw_decode.encode('utf-8'))
Out[24]: True

# 2번예제 ) decode string타입으로 변경을 하지않을경우
In [26]: bcrypt.checkpw(a.encode('utf-8'), hashed_pw_none.encode('utf-8'))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [26], in <cell line: 1>()
----> 1 bcrypt.checkpw(a.encode('utf-8'), hashed_pw_none.encode('utf-8'))

AttributeError: 'bytes' object has no attribute 'encode'
In [28]: bcrypt.checkpw(a.encode('utf-8'), hashed_pw_none)
Out[28]: True

  

 

DB에서 꺼내어 확인시에는 반드시 인코딩 하여 확인해야함!

26번째 라인에서 보이는 것처럼 bytes타입은 인코딩을 할수없기도 하며 비교시 인코딩을 하지않고 비교를 해야한다.

'Django' 카테고리의 다른 글

CSV Uploader  (0) 2022.07.06
JWT(Json Web Token)  (0) 2022.07.06
Bcrypt 사용?  (0) 2022.07.06
암호화의 종류  (0) 2022.07.06
양방향 vs 단방향 해시함수  (0) 2022.07.05