반응형
🗝️ 인증 Authentication
- Authentication은 유저의 identification을 확인하는 절차이다. (유저의 아이디와 비번을 확인하는 절차)
- 인증이 필요한 이유
- 누가 우리 서비스를 쓰는지, 어떻게 사용하는지 추적이 가능하도록 하기 위해
- 인증에 필요한 것
- 아이디, 이메일 주소, 비밀번호
사용자 비밀번호 암호화
- 절대 비밀번호 그대로 DB에 저장하지 않는다.
- 외부의 해킹 또는 내부 개발자나 인력이 유저들의 비밀번호를 볼 수 있다.
- 사용자 비밀번호는 반드시 암호화해서 저장한다.
- 일반적으로 비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰인다.
비밀번호는 국가에서 권고하는 상용 암호화 알고리즘을 이용해 암호화하도록 법적으로 요구하고 있다. (법규상의 강제)
단방향 해쉬 함수
원본 메시지를 변환하여 암호화된 메시지를 생성한다.
원본 메시지를 알면 암호화된 메시지를 구할 수 있지만, 암호화된 메시지로는 원본 메시지를 구할 수 없다 👉️
단방향성(one-way)
본래 해쉬함수는 자료구조에서 빠른 자료의 검색, 데이터의 위변조 체크를 위해서 쓰이지만 복원이 불가능한 단방향 해쉬함수는 암호학적 용도로 사용한다.
암호화 알고리즘 : MD5, SHA-1, SHA-256
단방향 해쉬 함수의 취약점
- Rainbow table attack : 미리 해쉬값들을 계산해 놓은 테이블을 Rainbow table이라고 한다.
- 패스워드가 충분히 길거나 복잡하지 않은 경우에는 해킹하는데 그리 긴 시간이 걸리지 않는다.
Salting & Key Stretching
단방향 해쉬함수의 취약점들을 보완하기 위해 일반적으로 2가지의 보완점들이 사용된다.
Salting
- 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법
Key Stretching
- 단방향 해쉬값을 계산 한 후 그 해쉬값을 또 해쉬하고, 또 이를 반복하는 것
🗝️ bcrypt
Salting과 Key Stretching을 구현한 해쉬 함수 중 가장 널리 사용되는 것이 bcrypt이다.
hash결과값에 salt값과 hash값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.
Install
pip install bcrypt
Usage
hashpw()
hashpw(password: bytes, salt: bytes) -> bytes
bcrypt.gensalt()
는 호출할 때 마다 랜덤한 salt값 반환- Database에 저장할 때는 hashed_pw를
string
으로 저장하기 때문에 Decoding에서 저장한다.
import bcrypt
password = '1234'
encoded_pw = password.encode('utf-8') # encoding한 문자열
# password hashing
salt = bcrypt.gensalt()
hashed_pw = bcrypt.hashpaw(password.encode('utf-8'), salt)
checkpw()
checkpw(password: bytes, hashed_password: bytes) -> bool
입력받은 password와 암호화된 password를 비교할 때 사용한다.
bcrypt.checkpw('1234'.encode('utf-8'), hashed_pw) # db에서 가져온 hashed_pw
참고 사이트
반응형
'프로그래밍 > 웹관련' 카테고리의 다른 글
TIL34 | HTTP Status Code (0) | 2021.10.27 |
---|---|
TIL33 | 인가(Authorization)와 JWT (0) | 2021.10.26 |
TIL22 | HTTP 특징과 구조(Request / Response) (0) | 2021.10.15 |
TIL10 | 크롬 개발자 도구 - Network panel (0) | 2021.10.08 |
[Pug] Syntax (0) | 2021.08.05 |