암호학적 해시함수 (Cryptographic Hash Function)

컴퓨터과학·AI
한 줄 정의: 어떤 크기의 데이터든 입력하면 항상 같은 길이의 고유한 "지문" 값을 만들어내는, 되돌릴 수 없는 함수입니다.

쉽게 풀면

사람의 지문처럼, 데이터를 암호학적 해시함수에 넣으면 그 데이터만의 고유한 짧은 문자열(해시값)이 나옵니다. 원본이 한 글자만 바뀌어도 해시값은 완전히 딴판으로 바뀌고, 반대로 해시값만 보고 원본 데이터를 역으로 알아내는 것은 사실상 불가능합니다(일방향성). 또한 서로 다른 두 데이터가 같은 해시값을 가지는 경우(충돌)가 나오지 않도록 설계되어 있습니다. 이런 성질 덕분에 "파일이 전송 중에 변조되지 않았는지" 확인하거나, 비밀번호를 원문 그대로 저장하지 않고 해시값만 저장하는 데 쓰입니다. 대표적인 알고리즘으로 SHA-256이 있으며, 블록체인에서 블록들을 서로 연결할 때도 이 성질이 핵심적으로 사용됩니다.

왜 중요한가

암호학적 해시함수는 데이터 무결성 검증, 비밀번호 저장, 전자서명, 블록체인 등 현대 정보보안 시스템 대부분의 기초를 이루는 요소입니다. 분산 시스템이나 블록체인 연구에서는 블록 간 연결과 위변조 방지를 이 함수의 일방향성과 충돌 회피 성질에 전적으로 의존하기 때문에, 새로운 프로토콜을 제안하는 논문에서는 어떤 해시함수를 사용했는지, 그 안전성 가정이 무엇인지를 명시하는 것이 필수적입니다. 또한 암호학 분야에서는 기존 해시함수의 취약점을 찾아내는 연구 자체가 중요한 연구 주제로 다뤄집니다.

논문에서는 이렇게 쓰입니다

"수집된 원본 데이터의 무결성을 보장하기 위해 SHA-256 암호학적 해시함수를 적용하여 각 파일의 해시값을 산출하고 저장하였다."

이 문장은 "데이터가 나중에 누군가에 의해 몰래 바뀌지 않았음을 증명할 수 있도록, 지문 역할을 하는 값을 미리 계산해 보관했다"는 뜻입니다.

"제안하는 프로토콜에서는 사용자의 비밀번호를 평문으로 저장하지 않고, 솔트(salt) 값을 덧붙인 뒤 bcrypt 해시함수를 통해 변환한 값만을 서버에 저장하도록 설계하였다."

비밀번호 원문 대신 해시값만 저장해, 서버가 해킹되더라도 원래 비밀번호를 알아낼 수 없도록 설계했다는 의미입니다.

"제안된 블록체인 구조에서는 각 블록이 이전 블록의 해시값을 포함하도록 하여, 특정 블록의 데이터를 변조하면 이후 모든 블록의 해시값이 연쇄적으로 달라지도록 하였다."

블록체인에서 데이터 위변조를 탐지 가능하게 만드는 핵심 원리인 해시 체인 구조를 설명한 문장입니다.

조금 더 깊게 보면

암호학적 해시함수가 안전하다고 평가받으려면 일방향성(원상 저항성), 제2원상 저항성(특정 해시값과 같은 값을 내는 다른 입력을 찾기 어려움), 충돌 저항성(같은 해시값을 내는 서로 다른 두 입력을 찾기 어려움)이라는 세 가지 성질을 만족해야 합니다. 과거 널리 쓰이던 MD5나 SHA-1은 충돌 저항성이 깨진 것으로 밝혀져 현재는 보안 용도로 권장되지 않으며, SHA-256이나 SHA-3 계열이 그 대안으로 널리 쓰입니다. 비밀번호 저장처럼 저속성이 오히려 안전성에 도움이 되는 경우에는 일부러 계산 비용을 크게 만든 bcrypt, scrypt, Argon2 같은 별도의 함수가 사용되기도 합니다.

주의할 점

암호학적 해시함수는 자료구조에서 값을 빠르게 찾기 위해 쓰는 해시테이블의 해시 함수와는 목적이 다릅니다. 해시테이블의 해시 함수는 속도가 중요하지만, 암호학적 해시함수는 역산 불가능성과 충돌 회피가 훨씬 더 엄격하게 요구됩니다. 또한 해시는 암호화(공개키 암호화)와 달리 원문을 복원하는 "복호화" 과정이 존재하지 않는다는 점도 구분해야 합니다.

관련 용어