Hashing

유아현·2023년 1월 6일
0

Network

목록 보기
6/8
post-thumbnail

❤️‍🔥 해싱 (Hashing)

복호화가 가능한 다른 암호화 방식들과 달리, 해싱은 암호화만 가능합니다.

해싱은 해시 함수(Hash Function)을 사용하여 암호화를 진행하는데, 해시 함수는 다음과 같은 특징을 가집니다.

  • 항상 같은 길이의 문자열을 리턴합니다.
  • 서로 다른 문자열에 동일한 해시 함수를 사용하면 반드시 다른 결과값이 나옵니다.
  • 동일한 문자열에 동일한 해시 함수를 사용하면 항상 같은 결과값이 나옵니다.

아래 표는 대표적인 해시 함수중 하나인 SHA1에 특정 입력 값을 넣었을 때 어떤 결과가 리턴되는지 보여주는 예시입니다. 이 링크에서 SHA1 함수를 직접 사용해볼 수도 있습니다.

비밀번호해시 함수(SHA1) 리턴 값
‘password’‘5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8’
‘Password’‘8BE3C943B1609FFFBFC51AAD666D0A04ADF83C9D’
‘kimcoding’‘61D17C8312E8BC24D126BE182BC674704F954C5A’

🔎 레인보우 테이블과 솔트(Salt)

그런데 항상 같은 결과값이 나온다는 특성을 이용해 해시 함수를 거치기 이전의 값을 알아낼 수 있도록 기록해놓은 표인 레인보우 테이블이 존재합니다. 레인보우 테이블에 기록된 값의 경우에는 유출이 되었을 때 해싱을 했더라도 해싱 이전의 값을 알아낼 수 있으므로 보안상 위협이 될 수 있습니다.

이 때 활용할 수 있는 것이 솔트(Salt) 입니다. 솔트는 소금이라는 뜻으로, 말 그대로 소금을 치듯 해싱 이전 값에 임의의 값을 더해 데이터가 유출 되더라도 해싱 이전의 값을 알아내기 더욱 어렵게 만드는 방법입니다.

비밀번호 + 솔트해시 함수(SHA1) 리턴 값
‘password’ + ‘salt’‘C88E9C67041A74E0357BEFDFF93F87DDE0904214’
‘Password’ + ‘salt’‘38A8FDE622C0CF723934BA7138A72BEACCFC69D4’
‘kimcoding’ + ‘salt’‘8607976121653D418DDA5F6379EB0324CA8618E6’

솔트를 사용하게 되면 해싱 값이 유출되더라도, 솔트가 함께 유출 된 것이 아니라면 암호화 이전의 값을 알아내는 것은 불가능에 가깝습니다.

🔎 해싱의 목적

그런데, 왜 복호화가 불가능한 암호화 방식을 사용하는 걸까요? 바로 해싱의 목적은 데이터 그 자체를 사용하는 것이 아니라, 동일한 값의 데이터를 사용하고 있는지 여부만 확인하는 것이 목적이기 때문입니다.

예시를 들어보겠습니다. 사이트 관리자는 사용자의 비밀번호를 알고있을 필요가 없습니다. 오히려 사용자들의 비밀번호를 알고 있다면, 이를 얼마든지 악용할 수 있기 때문에 심각한 문제가 생길 수도 있습니다. 그래서 보통 비밀번호를 데이터베이스에 저장할 때, 복호화가 불가능하도록 해싱하여 저장하게 됩니다. 해싱은 복호화가 불가능하므로 사이트 관리자도 정확한 비밀번호를 알 수 없게 되죠.

그럼 서버측에서 비밀번호를 모르는 상태에서 어떻게 로그인 요청을 처리할 수 있는 걸까요? 방법은 간단합니다. 해싱한 값끼리 비교해서 일치하는지 확인하는 것이죠. 꼭 정확한 값을 몰라도, 해싱한 값이 일치한다면 정확한 비밀번호를 입력했다는 뜻이 되기 때문에, 해싱 값으로만 로그인 요청을 처리하는데에도 전혀 문제가 없습니다.

이처럼 해싱은 민감한 데이터를 다루어야 하는 상황에서 데이터 유출의 위험성은 줄이면서 데이터의 유효성을 검증하기 위해서 사용되는 단방향 암호화 방식입니다.

0개의 댓글