728x90

로그인/ 회원가입 서비스를 제공하는 데 있어서, 사용자의 개인정보를 보호하기 위해서 중요한 정보는 암호화해서 내부 DB에 저장할 필요가 있다. 해당 암호화와 관련된 개념은 해싱이며, (완전 동일하진 않지만) 자료구조에서 공부할 때 들었던 해쉬함수를 토대로 해당 암호화 해싱에 대해서 이해하면 된다. 

 

[해쉬테이블에 대한 간략한 글]

hazel-developer.tistory.com/2?category=816261

 

해시테이블(HashTable)과 해시함수(HashFunction)에 대해서

시작하기 전에... 해시테이블(hash table)이란 주요 자료구조 중의 하나로, 말 그대로 여러 데이터들을 저장하고 관리하는 여러 방식 중의 하나라고 보면 된다. 해시테이블에 대해서 검색해 본 사

hazel-developer.tistory.com

 

해쉬함수를 통과한 암호화된 값을 내부 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

 

[Python, Flask] 암호를 안전하게 저장하기

웹 개발을 하다보면 비밀번호를 안전하게 저장해야한다. 일반적으로 해싱을 통해 이것을 해결하는데 단순 해싱의 문제점이 있다. 바로 동일한 문자열을 해싱했을 때 동일한 결과값이 나온다는

toughrogrammer.tistory.com

flask-bcrypt.readthedocs.io/en/latest/

 

Flask-Bcrypt — Flask-Bcrypt 0.5 documentation

Flask-Bcrypt Flask-Bcrypt is a Flask extension that provides bcrypt hashing utilities for your application. Due to the recent increased prevelance of powerful hardware, such as modern GPUs, hashes have become increasingly easy to crack. A proactive solutio

flask-bcrypt.readthedocs.io

growingsaja.tistory.com/347

 

[Flask1.1][Mysql] 실습 - 8 : 비밀번호 암호화하기 및 비밀번호check with bcrypt

목표 : Flask에 회원 비밀번호 암호화 기능을 추가합니다. 1. 암호화 : bcrypt 암호 알고리즘의 특징 일반적인 해시의 취약점을 보완하기 위해 salting과 key stretching 방법이 구현된 bcrypt를 사용합니다.

growingsaja.tistory.com

 

728x90

+ Recent posts