수학과의 좌충우돌 프로그래밍

[smileGate] 2차 과제 (1) password 저장방법, hash function 본문

스마일게이트

[smileGate] 2차 과제 (1) password 저장방법, hash function

ssung.k 2020. 1. 16. 16:39

어느 사이트에 회원가입 및 로그인 할 때 아이디와패스워드를 입력합니다.

서버에서는 해당 정보들을 DB 에 저장할텐데 패스워드는 어떻게 저장이 되고 있을까요?

만약패스워드를 평문 그대로 저장하고 있다면, 해당 사이트가 해킹 당할 경우 같은 패스워드를 사용하는 사이트는 모조리 패스워드를 바꿔야 할까요?

다행스럽게도 패스워드를 저장할 시 해시 함수를 통해 암호화를 거치게 됩니다.

어떻게 패스워드를 암호화하는지, 해시 함수는 무엇인지에 대해서 알아보도록 하겠습니다.

 

단방향 해시 함수

해시 함수는 수학적 연산을 통해 원본 메세지를 암호화된 메세지로 변환합니다.

그리고 변환된 메세지를 다이제스트라고 합니다.

이 때 단방향성이기 때문에 원본을 통해 암호화하기는 쉽지만 복호화는 불가능합니다.

복호화가 쉽게 가능하다면 평문으로 저장하는 것과 다를 바가 없겠죠.

 

avalanche 효과

avalanche 효과 는 쇄도 효과, 산사태 효과라고도 하며 해시 함수의 특징 중 하나입니다.

입력 값의 일부가 변경되어도 다이제스트가 완전히 달라지도록 설계되어 사용자의 원본 패스워드를 추론하기 어렵게 합니다.

다음 예시에서도 test1test2 는 숫자 하나만 바뀌었을 뿐인데도 결과값에 유사성은 상당히 낮습니다.

from hashlib import sha256

test1 = 'test1'
test2 = 'test2'

test1_result = sha256(test1.encode())
test2_result = sha256(test2.encode())

print(test1_result.hexdigest())
# 1b4f0e9851971998e732078544c96b36c3d01cedf7caa332359d6f1d83567014
print(test2_result.hexdigest())
# 60303ae22b998861bce3b28f33eec1be758a213c86c93c076dbe9f558c11c752

 

해시 함수의 문제점

하지만 해시 함수를 사용한다고 해서 모든 문제가 해결 되지는 않습니다.

아래와 같은 문제가 존재합니다.

 

Recognizability, 인식가능성

위 python 테스트에서 여러 번을 반복해도 같은 문자열은 같은 다이제스트를 출력합니다.

따라서 평문과 이에 대한 다이제스트 데이터가 충분하게 쌓이게 된다면 충분히 복호화가 가능해지게 됩니다.

위와 같은 평문과 다이제스트 데이터를 레인보우 테이블 이라고 하고 이러한 해킹 방법을 레인보우 공격 이라고 합니다.

 

Speed, 속도

해시 함수는 현재 암호학에서 많이 사용되고 있지만 초기 설계 목적은 빠른 데이터 검색이었습니다.

때문에 임의의 문자열의 다이제스트와 해킹할 다이제스트를 빠르게 비교할 수 있습니다.

MD5 해시 함수를 사용한 경우에는 초당 56억개의 다이제스트를 테스트 할 수 있을 정도입니다.

 

해시 함수 보완

위 문제점을 보완하기 위해서 아래와 같은 방법들이 등장하였습니다.

salting

salt 는 다이제스트를 생성할 때 추가하는 임의의 문자열입니다.

password 에 임의의 문자열 salt 을 추가하여 다이제스트를 생성하기 때문에 다이제스트를 알아낸다고 하더라도 이를 통해 패스워드를 찾기가 어렵습니다.

또한 여러 사이트에서 같은 패스워드를 사용한다고 하더라도 salt 값이 달라 다이제스트도 달라지기 때문에 인식가능성 문제가 개선됩니다.

이 때 salt 는 모든 password 에 대해서 고유한 값을 가지며 32바이트 이상이어야 안전을 보장할 수 있습니다.

 

key stretching

key stretching 은 해쉬함수를 반복적으로 사용하는 방법입니다.

password 에 대한 다이제스트를 생성하고, 이 다이제스트에 대해서 다시 다이제스트를 생성하는 방식을 반복하여 최종적인 다이제스트를 만들게 됩니다.

이를 통해 최종적인 다이제스트를 생성하는데 적당한 시간(0.2초 이상)을 소요되게 설정할 수 있습니다.

무차별 대입해 억지로 문제를 푸는 brute-force attack 공격에 대해 많은 시간이 걸리게 해 방어할 수 있습니다.

 

reference

https://d2.naver.com/helloworld/318732

'스마일게이트' 카테고리의 다른 글

[smileGate] 2차 과제 (2) Auth 서버 구현  (0) 2020.02.04
Comments