해싱 (Hashing)

sookyeong·2022년 3월 30일
0

해싱 (Hashing)


1. 해싱의 쓰임새

유저의 PW는 해싱하여 DB에 저장한다.

  1. 암호화 하지 않으면 DB가 해킹 당했을 경우, 유저의 PW가 그대로 노출된다.

  2. 외부 해킹이 아니더라도, 내부 개발자나 인력의 유저들의 PW를 볼 수 있게 된다.

  3. PW 암호에는 일반적으로 단방향 해시 함수가 쓰인다.


2. 해싱 (Hashing) vs 암호화 (Encryption)

일상에서는 어느 정도 통용되지만, 암호학적으로는 차이가 있다.

가장 큰 차이는 '방향성' 이다.

  1. 해싱 : 단방향. 복호화가 불가능하다.

  2. 암호화 : 양방향. 역으로 복호화가 가능하다.


3. 단방향 해시 함수 (One-Way Hash Function)

어떤 수학적 연산 (또는 알고리즘) 에 의해 원본 데이터를 매핑시켜 완전히 다른 암호화된 데이터로 변환시키는 것.

해시와 다이제스트

변환 그 자체를 해시라고 부르고, 해시에 의해 암호화된 데이터를 다이제스트 (Digest) 라고 한다.

이러한 단방향 해시 함수의 종류는 매우 많다. (SHA, MD, HAS, WHIRLPOOL...)

가장 대표적인 해시 알고리즘인 SHA-256을 통해 123456을 해싱하면,

8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 와 같이 나온다.

사용자 가입 시 PW를 그대로 저장하는게 아니라, 이렇게 나온 다이제스트를 DB에 저장한다.

다이제스트는 복호화가 불가능하기 때문에, DB를 털어 저런 값을 얻었다고 한들 실제 PW를 유추하기는 어렵다.

단방향 해시 함수의 한계점

  1. 동일한 메시지는 동일한 다이제스트를 갖는다. (Rainbow Table 의 존재)

  2. Brute Force (MD5를 사용한 경우 1초에 약 56억번까지도 대입 가능 + 사전) : 해시 함수는 원래 PW를 저장하기 위해서 설계된 것이 아니라, 짧은 시간에 데이터를 검색하기 위해 설계된 것이기 때문에 처리 속도가 매우 빠르다.

  3. 해시 충돌 (Hash Collsion) : 두 개의 서로 다른 입력에 대해 동일한 값을 얻게 되는 경우를 발견하면 이를 악용하여 위조된 데이터로 바꿔치기가 가능하다.

단방향 해시 함수 보완하기

  1. 키 스트레칭 (Key Stretching) : 해시 함수를 여러 번 수행하는 것으로 횟수는 개발자 본인만 알고 있다. Brute Force를 최대한 무력화 하기 위한 방법이다. (여전히 Rainbow Table 존재 가능)

  2. 솔트 (Salt) : 해시 함수를 돌리기 전, 원문 PW에 임의의 문자열을 덧붙이는 것. 단어 그대로 소금치는 (Salting) 것이다. 사용자마다 다른 솔트를 사용한다면 설령 같은 비밀번호더라도 다이제스트의 값이 다르기에 공격자에 의해 유추될 확률이 현저히 낮아진다. 사용자 가입 시 최종 다이제스트와 고유 솔트를 DB에 저장한다. 고유 솔트를 알았다고 한들, 해당 솔트와 결합하여 임의의 문자열을 Brute Force 해보아야 하기 때문에 방대한 데이터를 필요로 한다. 이로 인해 자연스럽게 Rainbow Table을 방지할 수 있다.

  3. 두 가지 방법의 혼용 : PW+Salt → Hash → Digest+Salt → Hash ...(n번)... → 최종 Digest (매 해시 함수를 사용할 때마다 솔트를 추가하여 덧붙인다.)

profile
actions speak louder than words

0개의 댓글