랑아
article thumbnail
Published 2023. 4. 22. 19:17
Hashing 기초 CS/인증&보안

Hashing

해싱은 어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것을 의미한다.
Hashing을 서비스에 적용할 떄는 세 가지의 철칙이 존재한다.

  1. 모든 값이 대해 해시값을 계산하는데 오래 걸리지 않아야 한다.
  2. 최대한 해시값을 피해야 하며, 모든 값은 고유한 해시값을 가진다.
  3. 아주 작은 단위의 변경이라도 완전히 다른 해시값을 가져야 한다.

대부분의 해시 알고리즘은 이런 특징을 가지고 있다.

배포되어 있는 알고리즘 중 대표적인 해시 알고리즘으로는 SHA1이 있고, 요즘은 SHA256을 많이 사용한다.

Salt

암호화에서 Salt는 암호화해야 하는 값에 어떤 '별도의 값'을 추가하여 결과를 변형시킨다.
특정 알고리즘을 통한 Hashing은 결과가 항상 같으므로 해시값과 원본값을 대조한 테이블이 있다면 쉽게 원본 비밀번호를 알아내는 경우가 있다.
이를 보완하기 위해 기존 문자열에 Salt 값을 추가한 후 Hashing 한다면 예상하기 힘든 전혀 다른 문자열(해시값)이 만들어진다.

따라서 Salt는 사용한 알고리즘이 노출되더라도 원본 비밀번호 데이터와 같이 중요한 데이터를 보호할 수 있는 안전장치 역할을 할 수 있다.

Salt 사용 시 주의점

  1. Salt는 유저와 패스워드 별로 유일한 값을 가져야 한다.
  2. 사용자 계정을 생성할 때와 비밀번호를 변경할 때마다 새로운 임의의 Salt를 사용해서 해싱해야 한다.
  3. Salt는 절대 재사용하지 않아야 한다.
  4. Salt는 DB의 유저 테이블에 같이 저장되어야 한다.

Salt와 Hashing을 사용하는 과정

유저마자 Salt를 다르게 하려면 DB에서도 Salt를 각자 다르게 가지고 있어야 한다.

Salt를 문자열 "test"라고 가정한다면 회원가입시 입력 받은 비밀번호에 문자열 "test"를 더한 후, 해싱 알고리즘을 통해 반환값이 DB에 저장된다.

이후에 로그인이나 인증이 필요한 요청에서, 입력 받은 비밀번호에 해당 유저의 Salt 값을 더해 해싱 알고리즘의 결과값과 DB에 저장된 유저의 비밀번호를 비교한다.

'CS > 인증&보안' 카테고리의 다른 글

Session 기초  (0) 2023.04.23
Cookie 기초  (0) 2023.04.22
HTTPS 기초  (0) 2023.04.22
profile

랑아

@RangA

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!