데이터 베이스에 정보를 저장할때 비밀번호와 같은 중요 정보는 암호화를 해서 저장합니다. 이러한 절차를 하는 이유는 데이터 베이스에서 직접적으로 암호를 확인 할 수 없도록 하고 데이터 베이스에서 암호화된 정보를 가져갔다 하더라도 실제로 로그인 하기 위해서는 암호화 하기 전 정보가 필요하기 때문이다.
대략적인 플로우입니다.
암호화를 위한 라이브러리인 bcrypt를 설치합니다.
pip install bcrypt
사용을 위해 import해줍니다.
import bcrypt
bcrypt는 str 데이터가 아닌 Bytes 데이터를 암호화 합니다. 때문에 암호화를 위해 Bytes화 해야합니다.
파이썬에서는 str 을 encode하면 bytes(이진화) 되고, Bytes 를 decode하면 str 화 합니다.
encode, decode시에는 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용합니다.
먼저 패스워드를 암호화 해봅시다.
password = '1234' hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) print(hashed_password) -> b'$2b$12$YFs9rh.1LgJwZuf9ibyjpuLvBoCaGX0MzedFWF2Jo0zU3lMZurZ4a' save_password = hashed_password.decode('utf-8')
bcrypt.hashpw() 를 통해 암호화 할 수 있습니다.
bcrypt.hashpw()에는 bytes가 들어기 때문에 password에 .encode('utf-8')를 사용하여 str를 bytes화 시킵니다.
bcrypt.gensalt()라는것이 들어가는데 이는 소금이라하여 암호화를 더 어렵게 할때 사용되고 이는 항상 암호화된 문자열 내에 포함 되어 있습니다.
이렇게 생성된 암호는 b' ~~ '로 bytes형식이며 데이터 베이스에 저장할때엔 .decode('utf-8')를 붙여 디코딩을 거쳐 str형태로 저장해야 합니다.
str형태로 저장하는 이유는 bytes를 바로 데이터 베이스에 저장하게 되어도 데이터 베이스에서는 단지 문자열로 저장을 하기 때문에 로그인을 위해 데이터를 받았을때 내용은 bytes형식이지만 str형식으로 받기 때문입니다.
new_password = '1234' bcrypt.checkpw(new_password.encode('utf-8'),save_password.encode('utf-8')) -> True
암호 인증을 위해 bcrypt.checkpw()를 사용합니다.
bcrypt.checkpw()는 마찬가지로 bytes를 정보로 받기 때문에 str정보를 .encode('utf-8')를 붙여 bytes화 시켜 입력해줍니다.
암호화된 비밀번호에는 bcrypt.gensalt()의 정보가 들어가 있기 때문에 따로 입력할 필요없이 바로 인증이 가능합니다.