메이쁘

[Hash][Encryption] Hash(해시) 와 Encryption(암호화) 알고리즘의 가장 큰 차이점은? 본문

면접 대비 CS지식/else

[Hash][Encryption] Hash(해시) 와 Encryption(암호화) 알고리즘의 가장 큰 차이점은?

메이쁘 2020. 7. 1. 22:30

안녕하세요.

 

Hash Table 이 아닌

 

암호화 해시 함수 

 

 

 

그리고

 

Encryption(암호화) 알고리즘

 

 

두 방식의 간단한 정의 및 차이점에 대해 가볍지만 핵심을 담아 포스팅 하겠습니다.

 

 

 

 

 

 

암호화 Hash(해시) 함수, 그리고 Encryption(암호화)


  -  Hash

      ->  해시 함수(해시 알고리즘) 을 이용하여 임의의 길이를 가진 데이터고정된 길이의 데이터맵핑하는 것.

 

      ->  단방향 암호화 기법

 

          즉, 임의의 길이 데이터 -> 고정된 길이 데이터 (암호화)가능하고,

          다시 고정된 길이 데이터 -> 임의의 길이 데이터 (복호화) 는 불가능하다.

 

 

      ->  MD5, SHA-1, SHA-256, SHA-512 알고리즘 등 이 있다.

 

 

반면,

 

 

  -  Encryption

     ->  양방향 암호화 기법

 

          즉, 평문(데이터) -> 암호화된 새로운 데이터 (암호화)가능할 뿐 아니라

          암호화된 데이터 -> 평문(기존 데이터) (복호화)가능하다.

 

 

      ->  수학적 과정을 통해 새롭지만 큰 의미가 없는 문장 으로 변환하는 알고리즘

 

      ->  대표적으로 RSA 알고리즘이 있으며, 공개키와 개인키 등 암호화 키를 사용하여 암호화 / 복호화 를 한다.

 

 

            

여기서 드는 의문점

 

 

  -  단방향 암호화 기법이면 해시 값에서 데이터를 절대 알아낼 수 없으니까 보안에 더 강하지 않나..?

 

  -  그럼 해시는 실제로 어디에 사용되고 있을까?

 

  -  아직 뚫린 해시 알고리즘은 없을까?

 

 

이에 대해, 해시를 좀 더 알아보겠습니다.

 

 

 

 

 

 

 

 

 

Hash(해시) 의 특징


  Q.  단방향 암호화 기법이면 해시 값에서 데이터를 절대 알아낼 수 없으니까 보안에 더 강하지 않나..?

 

  특징 1.  해커들이 무차별적으로 값을 해시로 변환한다면, 알아낼 수 있어 '무차별 공격' 에 취약하다.

  특징 2.  특정 입력 값에 대해 같은 해시 함수를 사용한다면, 항상 같은 해시 값이 출력된다.

  특징 3.  또한, 다른 입력 값이더라도 같은 해시 값이 출력될 수 있다. (아~~~주 극히 드물다.)

 

  *** 실제로 무료 사이트 등에서도 해시 값 생성 / 변환 을 알아서 해준다.

https://www.convertstring.com/ko/Hash/SHA256

 

SHA256 해시 - 온라인 SHA256 해시 생성기

 

www.convertstring.com

 

  Q.  아직 뚫린 해시 알고리즘은 없을까?

 

  실제로, MD5, SHA-1 해시 알고리즘이 뚫린 적이 있습니다.

  *** 한 번 뚫리면, 앞으로는 그 알고리즘을 사용하지 않도록 권고하고 있으며 해당 알고리즘을 개발한 사람에게도 피해가 갈 수 있어 절대 안뚫리게 알고리즘을 짠다곤 합니다.

 

 

  

  Q.  그럼 해시는 실제로 어디에 사용되고 있을까?

 

  특징 4.  보통 비밀번호 자체를 DB에 넣지 않고, 해시 값으로 변경하여 저장해둔다.

  특징 5.  또한, 메세지 인증 및 인증서 서명, 키 생성에도 사용된다.

 

 

 

 

 

허... 그럼 단순히 해시는 해시 함수(알고리즘) 만 사용하여 암호화 하면 끝인가요?

 

아닙니다.

 

 

실제로 해시를 보안성 강화로 사용하는 경우

 

솔트(Salt) 방법을 통해 한 층 견고하게 하는데요.

 

 

즉, 솔트(Salt) 란 

 

음식에 소금을 치듯이 

 

입력한 값에 특정 값(사용자가 직접 선정한 값. 예를 들어, 문자열 "1234") 을 원하는 위치(맨 앞, 맨 뒤, 중간 등)에 넣고

 

해시 함수를 사용하여 해시 값을 얻는 것 입니다.

 

 

 

예를 들어,

 

 

필자의 정보

  -  아이디 : myid

  -  비밀번호 : 1234

 

댓글달아주신 착한 사람의 정보

  -  아이디 : chackhan

  -  비밀번호 : 1234

 

 

라고 할 때, 어떤 해커가 DB에서 비밀번호 1234의 해시 값을 알아냈다고 했을 때

 

DB 테이블에서 밑으로 내리다보면 myid 와 chackhan 아이디의 비밀번호가 일치한다는 것 또한 쉽게 알 수 있겠죠?

 

 

그럼 일타쌍피! 하나의 해시 값으로 여러 사람의 개인정보까지 획득할 수 있습니다.

 

절대 안됩니다!

 

 

 

 

 

그래서!

 

해시 값을 저장할 때, 아이디 + 비밀번호 의 해시 값을 비밀번호로 저장합니다.

 

필자의 비밀번호 : myid1234 해시 값

착한 사람의 비밀번호 : chackhan1234 해시 값

 

결과가 당연히 다르겠죠?

 

 

이를 솔트(Salt) 라고 합니다.

 

 

 

 

 

 

 

 

이상, Hash와 Encryption에 대한 포스팅이었습니다.

 

둘 다 적재적소에 사용하면 좋을 듯 합니다.

 

감사합니다!

Comments