암호화에서 Hash 그리고 Salt, Pepper 쉬운 설명

오늘은 Hash, Salt 두 개의 용어를 배워보도록 합시다. 저도 초보라 같이 배우는 의미에서 글을 간단하게 작성합니다. 최근 방문자분께서 대기업 개인정보 유출 문제로 댓글을 달아주셨는데요. 한국에서 그 기업의 개인정보 이슈는 어제 오늘일이 아니기 때문에 슬프게도 식상할 정도라 다루지 않으려고 하다가 궁금해하시는 분이 직접 댓글을 달아주셔서, 그 전에 생소할 수 있는 두개의 용어에 대해서 간단하게 설명드리려고 합니다.

댓글에서도 언급하셨듯 이런 종류의 사건을 설명하려면 해시(Hash)와 솔트(Salt)를 알아야 합니다. 둘다 음식에 비유할 수 있어서 이해가 매우 쉬우실거예요.

이 글은 이제 개념을 배우고자하는 저와 같은 비기너들을 위한 글입니다. 추가할 내용이 있으면 좋겠다고 생각하시는 분들은 댓글 달아주세요. 🙂

해시(Hash)

어디서 많이 본 단어죠? 해시브라운, 해시포테이토의 그것과 같습니다. ‘잘게 부수다’라는 의미인데 여기서도 같은 의미로 쓰입니다.

해시의 가장 큰 역할은 ‘위변조 방지(무결성 검증)‘ 그리고 ‘암호화‘ 입니다. 우리가 VPN 사이트에서 SHA-256, SHA-512 같은 용어를 매번 보게되는데요. SHA는 ‘Secure Hash Algorithm‘의 약어입니다.

안전한 비밀번호 저장

여러분이 A라는 사이트에 비밀번호를 ‘12345678passwordiloveyou‘로 저장했는데 사이트 서버에 내 비밀번호 평문 그대로 저장이 되었다면 서버가 해킹 당하거나 데이터가 유출되었을때 내 비밀번호는 그 모습 그대로 알려지게 되는 것 입니다.

이런것을 방지하기 위해서 ‘해시된 값’으로 저장을 하기도 하는데요. 위의 패스워드를 sha256으로 해싱하면 ‘7572c1426f93d32e62363398625184251c756786c1b09b7218a67fb910d3698c‘이 됩니다.

같은 입력값을 넣으면 동일한 결괏값이 나옵니다.

위의 2개는 같은 문자열로 2번 테스트 한 것인데 동일하게 나오죠?

그 아래 too라는 단어를 추가했더니 완전히 다른 해쉬값이 나왔습니다. 한글자만 틀려도 아예 다른 값이 나옵니다.

여기서는 두 가지만 이해하고 넘어가시면 됩니다.

  1. Hash는 데이터를 잘게 부셔서 복잡한 연산을 통해 원래 형태를 알아보기 힘들게 만든 것이다. (으깬 감자처럼)
  2. 입력값에 따라 나오는 결괏값은 정해져있다.

무결성 확인

같은값이 나오기 때문에 무결성을 확인할 수 있습니다. 우리가 가끔 소프트웨어를 받을 때 볼 수 있습니다.

해시값 Checksum을 통해서 내가 다운로드 받을 데이터 혹은 전달 받을 메세지가 위변조되지 않았음을 확인할 수 있습니다.

Hash가 어디서 어떻게 쓰이는지 이해를 돕기 위해서 간단한 예로 설명드렸습니다. 이 외에도 티지털 서명 인증, 데이터 검색, 포렌식, 블록체인(비트코인, 이더리움)에서도 블록 해싱, 트랜잭션, 작업 증명 등 다양한 분야에서 사용됩니다.

그리고 COPS라는 받아선 안될 것을 다운로드 받는 사람들을 추적하는 시스템에도 Hash가 사용됩니다.

SHA (Secure Hash Algorithm) 종류

SHA 뒤에 붙는 160, 224, 256, 384, 512는 Hash bit 길이 입니다. 해시 값이 몇 비트로 구성되는지를 나타내요.

SHA VersionBit LengthIntroduced YearDescription
SHA-01601993Original version, quickly withdrawn due to undisclosed flaws
SHA-11601995Widely used, but deprecated due to vulnerabilities
SHA-2 (SHA-224)2242001Part of the SHA-2 family, generates 224-bit hash values
SHA-2 (SHA-256)2562001Commonly used, generates 256-bit hash values
SHA-2 (SHA-384)3842001Generates 384-bit hash values, part of the SHA-2 family
SHA-2 (SHA-512)5122001Generates 512-bit hash values, part of the SHA-2 family
SHA-3224, 256, 384, 5122015Newest version, uses a different cryptographic approach than SHA-2
Secure Hash Algorithm 역사

1993년에 미국 NSA가 처음 만들었습니다. 기존의 해시 알고리즘의 취약점이 발견되거나 시간이 자님에 따라 안전하지 않을 경우 보완해 업그레이드 버전이 나오는 것 입니다. SHA-3가 있다고 해서 SHA-2가 안전하지 않은 것은 아닙니다. 2024년 현재까지는 SHA-2 역시 광범위하게 사용되고 있습니다.

SHA-3가 나온 이유

SHA-1과 SHA-2는 구조적으로 큰 차이가 없기 때문에 더 높은 수준의 보안을 위해 만들어졌습니다. SHA-2의 충돌쌍 공격 가능성에 대한 의견이 나오기도 했고, 비약적인 컴퓨팅 성능 향상으로 앞으로의 보안을 장담할 수 없게 되자 미국 국립표준기술원 NIST(National Institute of Standards and Technology) SHA-3 알고리즘을 공모하게 되었는데 5년간의 공모 끝에 keccak Team의 해시 알고리즘이 선정되었습니다.

정확하게 이야기 하자면 SHA-3는 Keccak 알고리즘을 기반으로 하여 개발된 해시 함수 표준이며 FIPS 202 (Federal Information Processing Standards Publication 202)에 의해 정의되었습니다.

비트코인은 SHA-2를 사용하고 이더리움은 Keccak256를 사용합니다.

Hash 왜 추가적인 보안이 필요?

위에서 보여드린 것 처럼 Hash 값은 정해져있어요.

폰번호를 예로 들었을때 해커가 010-0001-0001 부터 010-9999-9999 까지의 해쉬값을 뽑아놓고 탈취한 Hash 값이랑 대조해보면 이론적으로 역연산이 가능하겠죠? Hash는 구조적으로 ‘복호화’가 안되기 때문에 이렇게 값을 뽑아놓고 비교해보는 방식을 사용하기도 합니다.

이것을 ‘Rainbow Table’이라고 합니다. 그렇기 때문에 변수를 추가해서 Hash 데이터를 탈취 당하더라도 거기서 유의미한 데이터를 뽑을 수 없도록 미리 작업해두는거죠. 여기에 필요한 것이 Salt and Pepper 입니다.

솔트(Salt)

“솔트(salt)”는 암호화에서 앞서 말씀드린 Hash 함수에 추가되는 임의의 랜덤값을 의미합니다. 우리가 아는 그 간 맞출때 사용하는 짠맛 소금 그거 맞습니다. 음식할때 소금을 추가하면 맛이 달라지는 것 처럼 해시 함수에 솔트를 추가해주면 결괏값이 달라지는 것에 비유해 이름을 정하게 되었다고 합니다.

앞서 설명드린것 처럼 Hash Value는 고정된 값을 생성합니다. 입력값이 같으면 결괏값도 똑같이 나오는거예요. 그럼 비밀번호를 ‘12345678password’로 저장한 사람들이 여러명이면 해쉬값으로 변환했다 하더라도 모두 같은 값이 나오게 됩니다.

이런 경우 솔트를 통해 랜덤값을 부여해 모두 다르게 생성되게 하는거죠.

12345678password 해시에 랜덤 Salt를 더해서 같은 값이라도 모두 다르게 생성해서 저장할 수 있습니다.

한마디로 소금을 살짝 뿌려서 다른 결과물을 만들어내는게 목적입니다. 그로인해 ‘무차별 대입 공격’, ‘레인보우 테이블 공격’ 등을 방지할 수 있습니다.

솔트에 대해서는 길게 설명하지 않아도 될 것 같습니다. 전공자가 아닌 우리는 이런 용도로 사용된다라는 것만 알면 충분합니다.

Pepper

여기서 후추는 또 왜 나와? 요리할 때 소금도 치고 후추도 뿌려주면 더 맛잇죠?

솔트와 조금 다른 개념입니다. Pepper가 만들어진 이유는 좀 더 강력하게 보안을 강화하기 위함입니다.

Salt는 ‘Hash 함수에 추가되는 랜덤 변수

Pepper는 모든 사용자에게 공통된 무작위 값을 추가해 Hash를 강화하는 방법이며 Salt와 다르게 데이터베이스에 함께 저장되지 않습니다.

Pepper의 값은 서버에 저장되며 비밀로 유지되어야 합니다.

Salt, Pepper 요약 : Salt를 통해 Hash값이 더 안전해지지만 함께 DB에 저장되므로 DB에 저장되지 않는 Pepper를 한 번 더 뿌려줘서 데이터베이스가 털려도 안전하게 지킬 수 있다.

4 Comments

    1. 아직은 관심 줄 정도도 안됩니다. 여전히 이스라엘을 아시아로 분류해놓는등 공식 문서 관리도 잘 안되고있는 것 같아요. 아시아 서버는 일본, 싱가포르 2개밖에 없습니다. 거기다 가격은 월 9.99달러의 Privacy Pro를 구독해야하기 때문에.. 사실 이걸 쓸 이유가 전혀없더라구요. 대폭 업그레이드가 필요한데.. 조금 더 지켜보다가 한번 리뷰해보겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다