Bcrypt란❓

이상민·2021년 2월 24일
0
post-custom-banner

1. 암호화

평문을 암호문으로 바꾸는 과정. 암호화 알고리즘을 통해 원래 정보를 변조시켜 복호화할 수 없다면 정보를 알 수 없게 만드는 것

  • 암호화는 가장 기본적인 정보보안 방법으로 그 자체로 데이터의 유출 등을 막지는 못하지만
    데이터에 담긴 정보를 알 수 없게 하는것이 목적이다

1-1. 비밀번호를 암호화해 저장하기

  • 비밀번호는 대표적으로 암호화해 저장할 정보 중 하나이다. 많은 사용자들이 동일한 아이디와 비밀번호를 여러 사이트에서 사용한다. 이 때문에 비밀번호가 유출될시 파급력이 크다

  • 비밀번호를 단방향 해싱 저장하므로서 외부 해킹에 의한 데이터 노출은 물론 내부 인력에 의한 데이터 유출도 방지할 수 있다

1-2. 해시 함수

  • 해시 함수란 복호화를 할 수 없는 알고리즘이다

  • sha256 : 대표적인 해시 함수로 평문의 길이에 상관없이 256비트의 고정된 암호문을 출력한다. 빠른 속도와 단방향성, 그리고 괜찮은 보안성으로 블록체인에서 많이 사용하는 암호화 알고리즘이기도 하다


2. Bcrypt

처음부터 단방향 암호화를 위해 만들어진 해시 함수

2-1. 기존 해시 함수의 문제점

  • sha256 같은 해시 함수들은 원래 암호화를 위해 설계된 것이 아니라 짧은 시간에 데이터를 검색하기 위한 자료구조로 설계가 되었다. 이 때문에 빠른 속도가 장점이지만 취약점의 원인이기도 하다.

  • rainbow table attack : 미리 해시 값들을 계산해 놓은 테이블을 가지고 해시 함수 반환 값을 역추적해 원래 정보를 찾아내는 해킹 방법이다.

  • 이런 취약점을 보안한 것이 바로 bcrypt같은 해시 함수이다

2-2. salting과 키 스트레칭

  • salting : 실제 정보 이외에 추가적으로 무작위 데이터를 더해서 해시 값을 계산하는 방법. salt로 인해 해시값이 달라지기 때문에, rainbow attack 같이 미리 해시 값을 계산해 하는 공격을 무효화 시킨다. salt 자체는 비밀이 아니고 해시 값을 바꾸는데 목적이 있다. salt는 비밀번호마다 모두 다르기 때문에 같은 비밀번호라도 해시값이 달라지게 된다. 이 때문에 공격자는 해시값 데이터베이스를 만들 수 없다.

  • 키 스트레칭 : 기존 단방향 해시 알고리즘의 빠른 실행 속도가 취약점이 됐던것을 보완하기 위한 방법. 단방향 해시 값을 계산한 후 그 해시 값을 다시 해시하고, 이를 반복한다. 향후 컴퓨터 성능이 향상되어도 해시 반복 횟수를 추가하여 계속해서 보완할 수 있다.

2-3. bcrypt

salting과 키 스트레칭을 구현한 해시 함수 중 대표적인 함수

  • bcrypt의 값은 4부분으로 나눠진다
    i) Algorithm : 알고리즘 식별자. '$2a$'는bcrypt를 뜻한다
    ii) Cost factor : 키 스트레칭한 횟수. 2^n으로 위의 경우 2^10=1024이다
    iii) Salt : 128비트 솔트, 22자 base64로 인코딩
    iv) Hash : salting과 키 스트레칭 후 해시 값

  • bcrypt에서 검증 : 비밀번호가 동일한지 검증하기 위해 입력된 비밀번호에 salting, 키 스트레칭을 해서 저장된 bcrypt 문자열과 비교한다.

2-4. 파이썬 bcrypt

  • bcrypt 라이브러리를 통해 쉽게 사용할 수 있다
# 라이브러리 설치
pip install bcrypt
>> import bcrypt
# 비밀번호는 b"string" 형태로 바이트 타입으로 전달하거나 인코딩 해야한다
>> pw = bcrypt.hashpw("password123".encode('UTF-8'), bcrypt.gensalt())
b'$2b$12$HsGoP1p7fPwP30FczkRFde0xeBtPK13qoYNp3iKdjF3KqIPfhtoOG'
>> bcrypt.checkpw("password123".encode('UTF-8'), pw)
True
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다
post-custom-banner

0개의 댓글