Encryption vs. Hashing
HMAC(Hash based Message Authentication Code)을 코드로 구현하고 있다가 문득 해싱(hashing)과 암호화(encryption)의 차이를 명확하게 구분하고 싶은 생각에 이 글을 쓰게 되었습니다.
쉽게 얘기하면 원본 문자열을 알아볼 수 없는 난해한 문자열로 정의(표현) 하는 과정입니다. 뚱뚱한 문자열이 해싱 후에는 날씬한 형태로 작게 바뀌니, 문자열을 소화시킨다는 의미에서 Message Digest라고도 표현합니다.
IT 시스템에서는 암호화를 통해 인가된 송신자와 수신자만 원본 메시지를 조회할 수 있는 장치를 만듭니다. 그렇지만 인가되지 않은 제삼자가 암호화된 메시지를 변조했는지는 복호화 과정에서 알 수 없습니다. 해싱의 필요성은 여기서 시작합니다. 누군가가 메시지를 변조했는지를 확인하기 위해 해싱을 사용합니다.
누군가 메시지를 변조했다면 해싱 값도 변경되기 때문에 변조 여부를 파악할 수 있습니다. 이 특성을 이용하여, 보안성이 필요한 데이터, 시스템, 통신 등에서 메시지 무결성(integrity)을 위해 사용합니다.
해싱과 암호화 모두 데이터의 보안성을 높이기 위해 사용한다는 공통점이 있습니다. 좀 더 특성을 비교하자면, 암호화(encryption)는 수신자와 송신자 사이에 암호화와 복호화 두 단계가 있고, 인가되지 않은 제삼자에게 데이터 노출을 막는 것이 목적입니다. 웹 사이트에 SSL 인증서가 있는 것도 결국 서버와 브라우저 사이의 통신에서 주고받는 데이터를 암호화하기 위한 것이죠. 해싱은 해시값을 검사하여, 데이터 변조가 없었는지 무결성을 확인하는 것이 주목적입니다.
아래 그림이 암호화와 해싱의 비교를 잘 표현하고 있습니다.
해싱은 다음과 같은 특징이 있습니다.
동일한 문자열은 동일한 해시 알고리즘을 사용하면 반드시 동일한 해시값을 생성합니다.
서로 다른 문자열은 동일한 해시 알고리즘을 사용하면 반드시 서로 다른 해시값을 생성합니다.
따라서 문자열을 수정하면, 당연히 해시값도 변경됩니다.
해싱이 완료되면, 해시값을 통해 원래의 문자열을 알아낼 수 없습니다. 즉, 변조 여부만 확인합니다.
☞ 하지만, 비밀키를 사용하는 특수한 경우는 예외적으로 원래의 문자열을 알아낼 수 있습니다.
대표적인 해싱 알고리즘은 다음과 같습니다. 몇 개는 보안상의 이유로 더 이상 사용을 하지 않는 것도 있습니다.
MD(Message Digest) 시리즈 - MD4, MD5, MD6.
SHA(Secure Hash Algorithm) 시리즈 - SHA, SHA-1, SHA-2, SHA-3
RIPEMD(RIPE Message Digest)
WhirlPool
메시지 자체의 암호화는 별도의 암호화/복호화 알고리즘을 사용합니다. 이것은 해싱과 다른 것입니다.
암호화된 메시지를 복호화 한 다음, 메시지 무결성(변조되지 않았다는 것)을 확인하기 위해 해싱을 사용합니다. ☞ HMAC(Hash based Message Authentication Code)
디지털 서명(digital signature)과 같은 암호화에 내가 서명한 내용이 변조되지 않도록 사용합니다.
많은 양의 데이터를 해시 값으로 작게 변환하면 빠른 데이터 비교가 가능합니다.
☞ 이 경우는 무결성 확인이 아닌, 많은 데이터를 빠르게 비교하기 위한 용도로 해싱을 사용하는 것입니다.
데이터의 중복 방지를 위해 임의의 문자열을 추가하여 해시값을 만들어 저장하는 시나리오도 가능합니다.
암호화는 단순한 평문(plain text)을 추가적인 정보와 함께 암호화 알고리즘을 사용하여 인코딩하는 과정입니다. 암호화된 메시지(cipher text)를 받은 수신자는 복호화 키를 사용하여 이를 평문으로 복원할 수 있습니다. 민감한 정보를 외부 노출로부터 보호할 수 있기 때문에 대부분의 IT 시스템에서 사용되고 있습니다.
암호화/복호화 키를 어떻게 사용하느냐에 따라 암호화 방식이 달라집니다.
대칭 암호화 - 암호화 키와 복호화 키가 동일.
비대칭 암호화 - 암호화 키와 복호화 키가 다름.
혼합방식 암호화 - 대칭 암호화와 비대칭 암호화를 혼용하여 사용.
대표적인 암호화 알고리즘은 다음과 같습니다.
AES(Advanced Encryption Standard)
3 DES(Triple DES)
RSA(Rivest–Shamir–Adleman)
ECDSA(Elliptic Curve Digital Signature Algorithm)
애플리케이션 개발 시 자주 사용하는 MD5, SHA256 등은 엄밀하게 얘기하면 암호화 알고리즘이 아닌, 메시지 변조 방지를 위한 해싱 알고리즘입니다.
데이터 보호 - 암호화된 데이터는 권한이 없는 타인에 의해 읽힐 수 없습니다.
데이터 무결성 - 암호화된 데이터는 권한이 없는 타인에 의해 수정될 수 없습니다.
☞ 변조 여부는 해싱으로 확인하지만 암호화는 아예 변조를 못하게 막는 개념입니다.
인증(Authentication) - 특정 데이터에 접근이 가능한 사용자인지 확인하는 과정입니다.
이 글은 해싱과 암호화를 비교하기 위한 기본적인 내용을 실었습니다. 실제 해싱 기술은 송수신자가 비밀키를 미리 공유하고, 이를 사용하는 메시지 무결성 검증 방식을 사용한다는 것을 잊지마세요.