지식

[지식] 암호화 (bcrypt)

개발로 먹고 살자 2022. 3. 2. 12:47

보안에서 가장 중요한 보안의 3요소는 기밀성, 무결성, 가용성이다.

 

기밀성(Confidentiality)

데이터가 암호화 되어 있지 않다면 전송되는 데이터는 중간에 탈취될 수 있다.

그렇게 때문에 이러한 데이터를 보호해주기 위한 보안으로 정보가 탈취되지 않도록 하는 것이다.

특정 데이터에 대해서 허가된 사용자 또는 대상에 한해서만 확인이 가능해야 한다.

통신하는 당사자만이 아는 비밀을 말하는데 이것을 보안에서는 기밀이라고 한다.

 

 

무결성 (Integrity)

특정 데이터에 대해 허가된 사용자 또는 대상에 한해서만 수정 및 삭제가 가능해야 한다.

허가 받지 않은 사용자가 특정 데이터를 수정, 삭제하는 경우 무결성이 깨졌다고 할 수 있다.

 

 

가용성(Availability)

사용자 또는 대상에 대해서 특정 정보에 대한 접근 및 사용 필요시 항상 가능해야 한다.
사용자가 원하는 시간, 환경, 서비스시에 특정 정보를 사용할 수 있어야 하며
사용이 불가능하다면 가용성이 깨졌다고 할 수 있다.

 

 

우리가 웹을 만들 때 로그인에 필수적으로 패스워드가 들어가게 된다.

 

이 때 단순 텍스트에 패스워드를 저장하는 것은 보안상 매우 취약하다.

 

그래서 우리는 패스워드를 암호화하여 DB에 저장한다.

여기서 고민이 되는 부분은 어떤 암호화 방식을 사용하여 DB에 저장할 것인가인데

 

우선 크게 양방향 암호화, 단방향 암호화가 있다.

 

양방향 암호화는 평문을 암호문으로, 암호문으로 평문으로 변경이 가능한 암호화 기법이다.

 

단방향 암호화는 양방향 암호화와 달리 평문을 암호문으로 암호화하는 것은 가능하지만,

암호문을 평문으로 복호화하는 것은 불가능한 암호화 기법이다.

 

 

양방향 암호화

양방향 암호화는 대칭 키, 비대칭 키로 나눌 수 있는데

 

대칭 키 암호화 방식은 암호화, 복호화 시 동일한 키를 사용하고,

이 키가 외부에 드러나게 되면 복호화하는 과정에서 데이터가 유출되기 때문에

타인에게 비공개로 한다. (비공개 키라고도 한다.)

한 쪽에서 다른 쪽으로 키가 이동해야 하기 때문에 중간에 암호화 키를 가로채게 된다면

정보가 유출될 수 있다.

AES방식이 대표적

 

비대칭 키 암호화 방식은 암호화, 복호화 시 서로 다른 키를 사용한다.

하지만 서로 다른 키는 밀접한 관계를 가지고 있기 때문에

암호화 A키, 복호화 B키가 존재한다면 A키로 암호화한 암호문은

B키로만 복호화가 가능하다.

하나의 키는 공개 키로 외부에 드러나도 상관 없다(공개키). 

다른 하나의 키는 비밀로 보호해야 한다.(개인키)

비대칭 키 암호화 방식은 대칭 키 암호화 방식에 비해 암호화, 복호화가 현저히 느리다.

RSA방식이 대표적

 

 

단방향 암호화

평문에서 암호문은 가능하지만, 암호문에서 평문으로 복호화는 불가능하다.

단방향 암호화로는 대표적으로 해시 암호화가 존재한다.

 

해시 암호화는 SHA-0, SHA-2, SHA-256 등 많은 방법이 존재한다.

하지만 이러한 해시 암호화는 GPU를 이용한 연산 속도가 매우 빠르기 때문에

공격자가 빠른 연산으로 공격할 수 있다.(ex 초당 수십억개의 해시 계산)

그렇기 때문에 password 암호화로는 권장되지가 않는다.

 

그렇기 때문에 bcrypt를 사용하는 것을 권장한다.

 

Bcrypt

bcrypt는 sha가 아닌 bluefish라는 암호에 기반한다.

또한 조정할 수 있는 해시 알고리즘을 사용하여 패스워드를 저장할 수 있다.

 

패스워드를 해싱할 때 내부적으로 랜덤한 솔트 값을 생성하기 때문에

같은 문자열에 대해서 매번 다른 인코드된 결과를 반환한다.

공통된 점은 길이가 60인 String을 만든다는 것이다.

 

보안 규정을 준수해야 하는 상황이라면 PBKDF2를 사용해야 하지만,

그게 아니라면 구현이 쉽고 비교적 강력한 bcrypt를 사용하자

(보안 시스템에 많은 비용을 투자할 수 있다면 scrypt를 사용)

'지식' 카테고리의 다른 글

[지식] 객체 지향 언어의 특징  (0) 2022.02.28
[지식] Accept Header  (0) 2021.12.30
[지식] Content-Type Header  (0) 2021.12.30
[지식] spring controller에서 sesstion 값 사용  (0) 2021.12.26
[지식] 프로그래밍 언어론  (0) 2021.11.23