bcrypt를 활용한 패스워드 암호화

칠팔구·2021년 6월 27일

이전 포스트에서 sign-up 함수를 통해 db연결까지 간단하게 구현했다.

다만, password가 단순 텍스트로 저장되고 있는 점이 문제였는데 이 부분을 bcrypt를 활용하여 해싱해보자

간단하다 아직 없다면 깔아주고

pip install bcrypt

가져다 쓸 때는

import bcrypt

기존에 구현했던 sign-up을 가져와서 password를 bcrypt를 이용해서 해싱하고 저장하자

@app.route('/sign-up', methods=['POST'])
def sign_up():
	new_user = request.json
    	new_user['password'] = bcrypt.hashpw(
    	new_user['password'].encode('utf-8'), bcrypt.gensalt()
        )
        
        new_user_id = insert_user(new_user)
        check_user = str(new_user_id)
        
        if check_user is None :
        	return 'fail', 400
            
        return check_user, 200
        

변경한 코드로 회원가입

password 상태

확실히 안전해졌다.

+추가
bcrypt가 하는 일은 다음과 같다

+salting : 음식에 간을 더 하듯 랜덤한 데이터를 더 해서 해싱한다. 어찌저찌하여 데이터를 추출하더라도 어디서부터 어디까지가 기존 데이터인지 알 수 없게 한다. 일련의 해시 데이터를 쭉 넣어서 공격하는 rainbow attack에 효과적이다.

+key streching
기존 단방향 해시 알고리즘의 실행 속도가 너무 빠르다는 취약점을 보완하기 위해서 N번의 해싱을 반복하는 것이 키 스트레칭이다. 물론 애초에 알고리즘 실행속도가 매우 빠르기 때문에 인증 실패를 적절하게 제한하여 사용하면 좋다.

도식화하면

  1. salt data + password

  2. N times hashing

  3. Hash result (+ 접근 횟수 제한 = 별도 구현)

profile
제가요?

0개의 댓글