비밀번호 암호화

이지연·2020년 10월 10일
signup_user.password = bcrypt.hashpw(signup_user.password.encode('utf-8'),bcrypt.gensalt()).decode('utf-8') 

암호화는 양방향, 단방향 알고리즘이 있다.

i )평문 -> 암호화 : 암호화
ii) 암호화 -> 평문 : 복호화

그런데, i)과 ii)를 둘다 하는 건 양방향 처리 방식이고,
i)만 하는 건 단방향 처리이다.

우리는 내부개발자나 해커들로부터 비밀번호 노출을 위해 암호화 처리를 하는 건데 복호화를 할 수 있게 하면 안되기 때문에 당연히 단방향 처리를 해야한다.

양방향 암호화를 하는 경우는 사용자주소, 이메일, 번호 또는 전자서명과 같이 재사용성이 있는 정보는 암호화/복호화를 둘다 하는 경우가 있다고 한다.

하지만!!나는 비밀번호이기 때문에 단방향 암호화처리를 할것이다.
그리고 단방향 해시함수를 하더라도 완전히 해커들로부터 안전하지 못하는 경우가 있다.

취약점
rainbow table attack과 해시함수로 인한 것인데....

rainbow table은 미리 해쉬값들을 계산해 놓은 테이블로 암호화된 비밀번호의 해시값을 확인해 복호화가 가능하다.
해시함수는 짧은 시간에 데이터를 검색하기 위해 설계된 것으로 해커가 빠른속도로 임의의 문자열의 다이제스트와 해킹할 대상의 다이제스트(암호화된 메시지)를 비교 한다.

그렇기 때문에 해커들에게 아직은 부족한 방어이다.

보안점
그래서!! 비밀번호를 단방향 암호화하기 위해 만든 클래스(모듈)이 나왔는데 바로 bcrypt이다.

bcrypt는 saliting과 key stretching을 이용한 방법이 있다.

먼저, saliting은 실제 비밀번호에 추가적인 랜덤 데이터를 더해서 해시값을 계산하는 방법이다. 실제 유저 비밀번호가 무엇인지 찾기 어렵게 만드는 방법이라고 생각하면 된다.

두번째로 key stretching는 단방향 해시값을 계산해, 해시값을 수차례 해싱해서 처음에 해시값을 알기 어렵게 하는 방법이다.

단방향 암호화는 SHA-256, SHA-3등이 있다.

profile
Everyday STEP BY STEP

0개의 댓글