로그인/ 회원가입 서비스를 제공하는 데 있어서, 사용자의 개인정보를 보호하기 위해서 중요한 정보는 암호화해서 내부 DB에 저장할 필요가 있다. 해당 암호화와 관련된 개념은 해싱이며, (완전 동일하진 않지만) 자료구조에서 공부할 때 들었던 해쉬함수를 토대로 해당 암호화 해싱에 대해서 이해하면 된다.
[해쉬테이블에 대한 간략한 글]
hazel-developer.tistory.com/2?category=816261
해쉬함수를 통과한 암호화된 값을 내부 DB저장하는 것이다. 해쉬함수는 일정한 규칙을 가진 함수로, A라는 intput값을 넣으면 항상 B라는 값이 출력된다. 하지만 해당 암호화 된 결과값으로 A를 다시 추론하는 복호화는 진행할 일이 없으며, 진행해서도 안된다!!!
복호화를 진행하지 않는다 하더라도, 단순해싱에 여전히 문제점이 발생할 수 있다. 이는, 암호화된 결과값을 비교하면 뭔지는 몰라도 몇몇의 비밀번호가 같다는 사실이 추론 가능한 것이다. 이러한 추론을 막기 위해서 단순 해싱보다는 라이브러리 사용을 선호한다.
물론 flask 자체적으로 라이브러리가 내장되어 있지만, 나는 구글링을 통한 트렌드에 따라서 flask-bcrypt를 사용해보고자 한다.
파이썬에는 일반적으로 pycrypto 또한 선호받는 암호화 라이브러리라고한다. 하지만 내가 Flask-Bycrypt를 사용하기로 결정한 이유는
1. 간단한 사용법 2. 암호화된 값을 DB에 저장하기 용이하다는 점
1번에 대해서는 아래에 사용법을 정리하면서 알게 되겠지만(나도 정리하면서 느낀것이지만) 크게로는 두개의 함수만 알고있으면 된다.
2번 이유에 대해서는 pycrypto를 통해 나온 결과갑은 난해하고 unicode로 변환이 되지 않는다! 따라서 mysql에 저장하기 위해서는 별도의 가공과정을 거쳐야 하는 것이다. 또한 우리가 암호화 라이브러리를 쓰는 이유는, 같은 비번이라도 다른 결과값이 나오게 하기 위함인데,
pycrypto도 결국 최초의 가공 시에는 동일한 결과가 나와버린다.
Flask-Bcrypt 사용하기
설치하기
pip install flask-bcrypt
사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from flask import Flask
from flask_bcrypt import Bcrypt
app = Flask(__name__)
app.config['SECRET_KEY'] = 'I am your father'
app.config['BCRYPT_LEVEL'] = 10
bcrypt = Bcrypt(app)
pw_hash = bcrypt.hashpw("password".encode("utf-8"), bycrypt.gensalt())
pw_hash2 = bcrypt.hashpw("password".encode("utf-8"), bycrypt.gensalt())
bcrypt.checkpw("password".encode("utf-8"), pw_hash) # True
#즉 password 라는 비밀번호를 암호화하고, 이후에 체크하는 작업을 할때 해당 메소드를 통해 일치여부 확인 가능
pw_hash == pw_hash2 # False
# 그러나 같은 password를 넣어도 다른 암호화 값이 나온다.
|
cs |
-> .decode('utf-8') 부분은 Python3 를 사용하면 써야한다고해서 붙였다. python2 를 사용하는 사람은 안 적어도 된다.
[Reference]
toughrogrammer.tistory.com/216
flask-bcrypt.readthedocs.io/en/latest/
'SW Engineering > BE' 카테고리의 다른 글
Flask로 서버 모듈 구축하기_파일분리하기(feat. blueprint / flask-restx) (2) | 2020.11.20 |
---|---|
Flask 서버_JWT활용한 인증기능 (0) | 2020.11.19 |
Flask 서버구축하기_MVC 패턴(feat. blueprint) (1) | 2020.11.14 |
Flask 서버구축하기_에러/로깅 다루기/데코레이터 (0) | 2020.11.13 |
Flask로 서버 구축하기_REST API(feat. 프론트) (0) | 2020.11.13 |