bcrypt...?

유웅조·2020년 1월 14일
2

개요

사용자에 대한 중요한 정보를 데이터베이스에 저장하는 경우에는 항상 주의를 기울여야 한다. 데이터가 곧 자산이 되는 시대에서 개인 정보가 유출되는 것은 끔찍한 일이 될 것이다. 그렇기 때문에 개발자라면 반드시 보안에 각별한 신경을 써야할 것이다.

개발자가 데이터를 저장할 때

보통 개발자라면 다음과 같은 방식으로 데이터를 저장한다. 먼저 순수한 데이터(Plain Data). 그리고 암호화된 데이터.

만약 비밀번호와 같은 것을 Plain Data로 저장한다면, 이것으로 인한 범죄는 시간 문제이다. 그렇다면 데이터를 암호화할 때 주로 어떤 방법을 쓸가. 많이 쓰는 방법 중의 하나가 바로 bcrypt를 사용한 암호화이다. bcrypt는 단방향 해시 함수를 말한다. 흔히 사용하는 해시 알고리즘인 SHA-256을 사용해서 데이터를 해시한다.

bcrypt를 사용하면 안전할까

bcrypt는 단방향이기 때문에 복호화가 불가능하다. 따라서 해싱 후 데이터를 저장하게되면 데이터를 보더라도 원본 값을알 수 없을 것이다. 하지만 그렇다고 해서 완전히 안전한 것은 아니다.

만약 해싱된 값(다이제스트)을 대규모로 확보한 뒤, 특정 해싱값에 대해 반복 대조를 하기 시작하면 어렵지 않게 그 해싱값의 원본을 찾아낼 수 있을 것이다. 이때의 대규모로 확보해둔 데이터를 Rainbow Table이라고 하며, 이를 활용한 공격을 Rainbow Attack이라고 한다.

사실 해시 함수는 암호화를 위한 것이 아니라 빠른 조회를 위해 고안된 것이다. 그렇기 때문에 공격자가 이러한 해시 함수의 특성을 활용해서 매우 빠른 속도로 임의의 데이터를 비교, 대조할 수 있다.(MD5를 사용한 경우, 일반적인 장비를 사용하여 1초에 56억 개의 다이제스트를 대입할 수 있다)

Salt & Key Stretching

이러한 문제를 보완하기 위해 등장한 것이 Salting 솔팅이라는 개념이다. 솔트는 말그대로 소금이라는 의미를 갖고 있다. 우리가 음식에 간을 더하기 위해 소금을 치듯, 임의의 데이터를 해싱할 때 일종의 소금과 같은 추가적인 데이터를 함께 해시하는 것을 의미한다. 이러한 방식을 사용하면 만약에 Rainbow Attack을 이용해 원본값을 알아낸다하더라도 정확한 원본을 파악하기 힘들다.

하지만 이 방법도 완벽한 해결 방법은 아니다. 그래서 Key Stretching을 추가적으로 이용한다. 솔트와 함께 임의의 데이터를 해싱하여 다이제스틀르 생성하고, 이것을 또다시 해시하고, 또 해시하고... 를 임의의 수만큼 반복한다. 따라서 원본값까지의 추적을 굉장히 어렵게 만든다.

0개의 댓글