사용자 패스워드 전송 및 보관 방법

2023. 1. 6. 14:59기술 창고/정보 창고

728x90
SMALL

보안은 개발자들이 가장 중요하게 생각하는 부분 중 하나이다.

현재 계정을 생성하고 이용하는 사이트들 중에서 보안을 중요하게 생각하지 않는 사이트는 거의 없을 것이다.

 

그중에서도 비밀번호에 대한 관리는 철저히 관리되어야 한다.

기본적으로 비밀번호를 관리하는 데에 있어서 가장 대표적인 방법은 암호화 / 복호화를 통해 관리하는 것이다.

다만, 암호화라는 것은 양방향성을 띄는 관리 기법이다.

즉, 암호화를 하게 된다면 반대로 복호화도 가능하다는 것이고, 이를 활용해서 해킹을 당할 수도 있는 것이다.

 

이러한 양방향성에 대한 문제점을 인식하고 보완하여 관리하는 방식이 단방향성의 해싱기법이다.

 

단방향 해싱

단반향 해싱은 원본 데이터를 입력하게 되면 완전히 다른 암호화된 데이터로 변환한다.

이 점은 기본적인 암호화방식이랑 비슷하다고 볼 수 있다.

이 변환을 해시라고 부르고, 해시에 의해 암호화된 데이터를 다이제스트라고 한다.

 

간단하게 그림으로 설명한다면 다음과 같다.

 

 

즉 원본 메시지 123456 을 해시 함수에 돌려서 다이제스트인 fs32a3xzz0 을 생성하고 해당 데이터를 DB 에 저장하는 것이다.

.

이렇게 저장된 다이제스트는 설령 DB가 털린다 하더라도 fs32a3xzz0 은 단방향으로 해싱 된 문자라 복호화 할 수가 없는 것이다. 또한 의미를 파악할 수도 없다.

 

또한, 123456에 아주 약간의 변경을 주게 되면 다이제스트가 완전히 바뀌게 되어 비밀번호를 유추하기 어렵게 된다.

하지만 이러한 해시 기법에도 한계점이 존재한다.

 

 

단방향 해시 한계점

1. 동일한 메시지는 동일한 다이제스트를 갖는다.

앞서 위의 123456을 SHA-256 을 통해 다이제스트를 얻었다. 분명 123456 의 다이제스트는 원래의 password 인 123456 을 유추하기 어렵다. 그러나 123456 에 대한 다이제스트는 항상 같은 값을 얻는다는 것, 즉 값이 변하지 않는 것이 큰 문제점이다.

 

2. 무차별 대입 공격 (브루트포스)

해시 함수의 경우 원래 빠른 데이터 검색을 위한 목적으로 설계된 것이다.

그렇다보니 해시 함수를 써도 원문의 다이제스트는 금방 얻어진다.

바로 이 점이 문제점인데, 우리가 다이제스트를 빠르게 얻을 수 있는 것과 동일하게 해커도 똑같이 빠르게 값을 얻을 수 있다는 것이다.

즉, 해커는 무작위의 데이터들을 계속 대입해보면서 얻은 다이제스트와 해킹할 대상의 다이제스트를 계속 비교를 해보는 것이다.

 

해시를 통한 다이제스트 값을 빠르게 얻을 수 있는 만큼 해커입장에서는 좋을 수 밖에 없다.

 

 

 

단방향 해시 한계점 보완

위의 설명을 통해서 해시 기법이 단순히 안전하다고만 볼 수 없다는 것을 정리해보았다.

그렇다면, 이를 좀 더 안전하게 보완할 수는 없을까? 알아보자.

 

1. 해시 함수 여러 번 수행하기 [키 스트레칭 _ Key Stretching]

우리가 패스워드를 저장할 때 가장 쉽게 생각 할 수 있는 방법이다.

예로들어 SHA-256 을 사용한다고 가정할 때, 123456 이 입력되었다면 123456 의 다이제스트는 아래와 같았다.

8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

 

이 다이제스트를 한 번 더 SHA-256 에 돌리는 것이다.

그러면 아래와 같은 값이 나온다.

49dc52e6bf2abe5ef6e2bb5b0f1ee2d765b922ae6cc8b95d39dc06c21c848f8c

 

물론 돌리는 횟수는 개발자 본인만 알고있는 것이 최고지만, 설령 소스파일을 들여다보았다 하더라도 최종 다이제스트의 원문 메시지를 얻기 위해 소모되는 시간은 더욱 많이 소요되므로 해커 입장에서는 곤란해지게 된다.

 

또한 해시 함수를 여러번 돌리는 만큼 최종 다이제스트를 얻는데 그만큼 시간이 소요되기 마련이다.

 

 

사용자의 경우 패스워드를 입력하고 일치여부를 확인 할 때 0.2 ~ 0.5 초만 걸려도 크게 문제가 없다. 그러나 앞서 말했듯이 임의의 문자열을 무차별 대입하는 해커 입장에서는 1초에 10억번의 다이제스트를 얻을 수 있었으나 다이제스트를 얻기 까지의 시간을 지연시켜 이제는 한 횟수당 0.2 ~ 0.5초가 걸리기 때문에 매우 치명적이다.

 

즉, 브루트포스를 최대한 무력화 하기위한 방법인 것이다

 

 

2. 솔트 (Salt) 

솔트란 해시함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것을 말한다. 단어 뜻 그대로 원문에 임의의 문자열을 붙인다는 의미의 소금친다(salting) 는 것이다.

 

 

 

이렇게 하면 설령 다이제스트를 알아낸다 하더라도 password 를 알아내기 더욱 어려워진다. 그리고 사용자마다 다른 Salt 를 사용한다면 설령 같은 비밀번호더라도 다이제스트의 값은 다르다. 이는 결국 한 명의 패스워드가 유출되더라도 같은 비밀번호를 사용하는 다른 사용자는 비교적 안전하다는 의미기도 하다.

.

 

(출처 : https://st-lab.tistory.com/100)

728x90
반응형
LIST

'기술 창고 > 정보 창고' 카테고리의 다른 글

Non-Blocking IO / Blocking IO  (0) 2023.02.10
프로세스 (Process) / 스레드 (Thread)  (0) 2023.01.23
Stateful / Stateless  (0) 2023.01.09
시간복잡도 / 공간복잡도  (0) 2023.01.06
CORS (교차 출처 리소스 공유)  (0) 2023.01.05