본문 바로가기

신입 개발자 면접 기초

해시(hash)와 암호화(Encryption) 차이점, 사용 용도

반응형

해시(Hash)와 암호화(Encryption)의 차이점이 무엇인가요?

둘 다 암호화 기법이지만 Hash단방향 암호화 기법이고 Encryption은 양방향 암호화 기법이다.

쉽게 설명하면 Hash는 평문을 암호화된 문장(텍스트)으로 만들어주는 기능을 하고,

Encryption은 평문을 암호화된 문장(텍스트)로 만들어주는 기능을 하고 + 암호화된 문장을 다시 평문으로 만드는 복호화 기능도 한다.

해시(Hash)는 어떻게 암호화가 이루어질까?

예시로 설명하면 평문의 비밀번호 "jeongpro1234"를 해시함수(해시 알고리즘)를 이용하여 고정된 길이의 암호화된 문자열로 바꿔 버리는 것이 해시를 이용한 암호화 기법이다.

* 해시에서 알아야 할 것들

- 해시 알고리즘 및 밑에서 얘기할 암호화 알고리즘은 종류가 다양하며, 알고리즘은 모두에게(해커에게도) 공개되어있다. 

(대신 알고리즘에 취약점이 발견되어 취약점에 의해 보안이 뚫리면 알고리즘을 만든 사람(암호학자)이 형사 처벌(?)된다. 따라서 알고리즘을 만들 때 엄청나게 많은 검증을 거치게 되고, 많은 개발자들이 검증된 것들을 사용한다.)

- 해시 알고리즘마다 Hash 길이가 다르고 이미 보안이 뚫린 해시 함수가 존재한다.

(MD5, SHA-1, HAS-180은 사용하면 안된다. SHA-256, SHA-512등을 사용하기를 권고함. 참고로 SHA-512가 보안이 더 좋음.)

- 해시 알고리즘은 특정 입력 대해 항상 같은 해시 값을 리턴한다.

(이 점을 이용해서 '인증'이 가능하다. 어떤 입력인지 몰라도 해시함수를 이용해서 해시된 값이 일치하면 입력이 같다는 것이 입증된다.)

- 해시된 값은 입력이 다른 값이지만 같을 수 있다.

입력은 만들어낼 수 있는 평문이 길이제한이 없다면 무한정으로 만들어 낼 수 있지만 해시된 값은 항상 고정된 길이의 값으로 나타내므로 한계가 있기 때문에 다른 입력이지만 해시된 값이 같은 경우가 나타날 수 있음.

(중복이 적게 나타날 수록 좋은 해시함수)


단순히 해시 함수를 이용해서 변환만 한다고 해서 보안이 완벽에 가깝다고 말할 수 없다.

왜냐하면 해커가 무차별적으로 임의의 값을 입력하면서 비밀번호를 알아낼 수 있기 때문이다.

이런 점을 보완하기 위해 비밀번호에 솔트(salt)값을 넣는 방법이 있고, 해시 함수를 여러번 돌리는 방법이 있다.

비밀번호를 예로 들면 개개인마다 다른 임의의 솔트값을 데이터베이스에 같이 저장해서 해시함수를 적용할 때 해당 솔트값을 이용하는 것으로 비밀번호를 암호화 시키는 방법이다.

참고로 솔트값을 넣는 방법은 다양하다. (비밀번호 양쪽에 솔트값을 넣고 해시함수를 수행하는 방법, 한쪽에 넣고 해시함수를 수행한다음 다시 솔트값을 넣고 수행하는 방법등)

따라서 솔트값을 알아도 해커가 운이 정말 좋아도 한 명정도의 개인정보를 알아갈 뿐, 개인정보 유출사태는 일어나지 않게 된다.

그러나 해시 함수는 태생이 암호화를 위해서가 아니라 검색을 빨리하기 위한 것이라 속도가 굉장히 빠르다.

그렇기 때문에 요즘 나오는 고성능의 GPU등을 이용해서 무차별적으로 대입해보기를 시도하면 1초에 약50억번이상 대입이 가능하기 때문에 대입하다보면 뚫을 수도 있다.

따라서 이런 점을 보완해야 하는데 이럴 때 해시 함수를 여러번 돌리면서 강제적으로 1회 대입에 걸리는 시간을 높이는 방법을 이용하는 것이다.

사람은 로그인에 걸리는 시간(대입에 걸리는 시간)이 0.2초가 걸리더라도 느리다고 여기지 않는다.

이 점을 이용하여 1회에 약 0.2초가 걸리게 강제적으로 만든다면 무차별 대입을 50억번하려면... 어마어마한 시간이 걸리기 때문에 해커들이 시도조차 하기 어렵게 만든다.


결국 좋은 해시 함수와 솔트를 이용하는 방법 + 해시 함수를 여러번 적용하는 방법을 이용하는 key derivation function가 존재한다.

개발자는 위의 내용정도만 이해하고 [사용]만 잘하면 된다.

pbkdf2 : 솔트값과 해시함수의 반복횟수등을 지정할 수 있다. 해당 프로그래밍언어와 같이 검색해보면 됨.

bcrypt : 패스워드를 위해 탄생해서 아주 강력한 해시 알고리즘이 적용됨. 마찬가지로 검색해서 사용 (Spring security에서 사용함)


암호화(Encryption)는 복호화가 필요한 데이터 혹은 전에 언급했던 Https처럼 통신(송수신)에 있어서 사용 된다.

지난 글을 볼 것. 

반응형
  • Favicon of https://yjshin.tistory.com BlogIcon Nye 2019.06.13 17:48 신고

    솔트가 머예요?

    • Favicon of https://jeong-pro.tistory.com BlogIcon JEONG_AMATEUR 2019.06.14 12:02 신고

      해시할 때 소금(salt)치듯 추가되는 임의의 문자열입니다.

      비밀번호를 해시하는데 해시에 사용되는 값이 비밀번호만 쓰면,
      같은 비밀번호에 대해서 같은 해시값을 쓰게 됩니다. 그러면 보안에 위협이 될 수 있습니다.

      만약 어떤 사이트에서 SHA-512 해시함수를 쓰고, Nye님과 제가 같은 비밀번호 "12345678"를 쓰면 같은 "FA585D89C851DD338A70DCF535AA2" 이런 해시값을 얻는다고 칩니다.

      그러면 해커가 해당 사이트 DB에서 비밀번호(해시값)을 탈취해서 봤는데 아래 값 입니다. "FA585D89C851DD338A70DCF535AA2"이 값을 보면 이 유저의 비밀번호가 "12345678" 이구나를 알게 됩니다.

      그래서 같은 "12345678"을 쓰더라도 제 패스워드는 salt 문자열 "aeo1oefoa" 이란것을 추가해서 "12345678aeo1oefoa" 라는 문자열을 해시해서 "26E0FC5C706695A" 이런 결과를 저장하는 것이고,

      Nye님의 패스워드는 또 다른 salt 문자열 "woeoskd1" 이란 것을 추가해서 "12345678woeoskd1"에 대한 해시 값 "FF4D13959DA6F1F5D3"을 생성해서 저장합니다. (어떤 유저에 어떤 솔트를 썼는지는 저장해야함.)

      그러면 해커는 12345678에 대한 해시값을 알지만 어떤 솔트가 추가됐는지를 모르니까 찾기 어렵겠죠.

      추가적으로 공격자는 "12345678" 이라는 패스워드 앞에 솔트를 연결할지, 뒤에 연결할지, 둘다 연결할지 모르고,
      솔트가 추가된 해시값을 다시 한 번 더 솔트를 추가해서 해시값을 만들지 N번 더 솔트값을 칠지를 모르기 때문에 공격하기 어려워 집니다.

  • 오우 2019.11.07 17:36

    우오... 굉장한 기법(?) 이네요

  • 보안굿 2020.04.26 14:13

    해시의 보안 요구 사항을 위해 역상저항성과 두번째 역상저항성, 그리고 충돌 저항성을 만족해야 한다는 내용도 같이 추가되면 좋을것 같네요 좋은 자료 잘 읽고 갑니다~

    • Favicon of https://jeong-pro.tistory.com BlogIcon JEONG_AMATEUR 2020.04.27 11:06 신고

      말씀해주신 내용 덕분에 공부를 더 할 수 있게되어 감사하게 생각합니다.

      y = hash(x); 일 때,

      역상저항성 :
      y(해시값)만 알 때, x를 유추하기 어려워야 한다.

      두 번째 역상저항성 :
      x를 알 때, 동일한 y를 갖는 x2를 유추하기 어려워야 한다.

      충돌 저항성 : 임의의 해시값 y1(hash(x1)), y2(hash(x2)가 같을 때, x1와 x2를 유추하기 어려워야한다.

  • 2020.12.27 04:20

    고등학교 탐구보고서 작성하는데 큰 도움이 되었습니다 감사합니다