해시(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처럼 통신(송수신)에 있어서 사용 된다.



출처: https://jeong-pro.tistory.com/92?category=793347 [기본기를 쌓는 정아마추어 코딩블로그]

+ Recent posts